package me.amitshekhar.learn.kotlin.flow.ui.map import android.os.Bundle import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.coroutines.launch import me.amitshekhar.learn.kotlin.flow.data.api.ApiHelperImpl import me.amitshekhar.learn.kotlin.flow.data.api.RetrofitBuilder import me.amitshekhar.learn.kotlin.flow.data.local.DatabaseBuilder import me.amitshekhar.learn.kotlin.flow.data.local.DatabaseHelperImpl import me.amitshekhar.learn.kotlin.flow.data.local.entity.User import me.amitshekhar.learn.kotlin.flow.databinding.ActivityRecyclerViewBinding import me.amitshekhar.learn.kotlin.flow.ui.base.UserAdapter import me.amitshekhar.learn.kotlin.flow.utils.DefaultDispatcherProvider import me.amitshekhar.learn.kotlin.flow.ui.base.UiState import me.amitshekhar.learn.kotlin.flow.ui.base.ViewModelFactory class MapActivity : AppCompatActivity() { private lateinit var viewModel: MapViewModel private lateinit var adapter: UserAdapter private lateinit var binding: ActivityRecyclerViewBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityRecyclerViewBinding.inflate(layoutInflater) setContentView(binding.root) setupUI() setupViewModel() setupObserver() } private fun setupUI() { binding.recyclerView.layoutManager = LinearLayoutManager(this) adapter = UserAdapter( arrayListOf() ) binding.recyclerView.addItemDecoration( DividerItemDecoration( binding.recyclerView.context, (binding.recyclerView.layoutManager as LinearLayoutManager).orientation ) ) binding.recyclerView.adapter = adapter } private fun setupObserver() { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.uiState.collect { when (it) { is UiState.Success -> { binding.progressBar.visibility = View.GONE renderList(it.data) binding.recyclerView.visibility = View.VISIBLE } is UiState.Loading -> { binding.progressBar.visibility = View.VISIBLE binding.recyclerView.visibility = View.GONE } is UiState.Error -> { //Handle Error binding.progressBar.visibility = View.GONE Toast.makeText(this@MapActivity, it.message, Toast.LENGTH_SHORT).show() } } } } } } private fun renderList(users: List) { adapter.addData(users) adapter.notifyDataSetChanged() } private fun setupViewModel() { viewModel = ViewModelProvider( this, ViewModelFactory( ApiHelperImpl(RetrofitBuilder.apiService), DatabaseHelperImpl(DatabaseBuilder.getInstance(applicationContext)), DefaultDispatcherProvider() ) )[MapViewModel::class.java] } }