package mx.trackermap.TrackerMap.android.units import android.content.Context import android.content.Intent import android.os.Bundle import android.util.Log import android.view.View import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.commit import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.android.databinding.UnitsActivityBinding import mx.trackermap.TrackerMap.android.devices.DevicesFragment import mx.trackermap.TrackerMap.android.map.UnitMapFragment import mx.trackermap.TrackerMap.android.session.UserInformationActivity import org.koin.androidx.viewmodel.ext.android.viewModel @DelicateCoroutinesApi class UnitsActivity : AppCompatActivity() { private var _binding: UnitsActivityBinding? = null private val binding get() = _binding!! private val unitsViewModel: UnitsViewModel by viewModel() private val mapFragment: UnitMapFragment by lazy { UnitMapFragment(unitsViewModel) } private val devicesFragment: DevicesFragment by lazy { DevicesFragment(unitsViewModel) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = UnitsActivityBinding.inflate(layoutInflater) setContentView(binding.root) setupEvents() } override fun onResume() { super.onResume() setupObservers() } override fun onPause() { super.onPause() removeObservers() } override fun onDestroy() { super.onDestroy() _binding = null } private fun setupEvents() { binding.userButton.setOnClickListener { val intent = Intent(applicationContext, UserInformationActivity::class.java) startActivity(intent) } binding.displayModeToggle.setOnClickListener { unitsViewModel.toggleDisplayMode() } binding.mapLayerToggle.setOnClickListener { showLayersPopUp(it) } binding.searchInput.doAfterTextChanged { Log.d("UnitsActivity", "Search changed to ${it.toString()}") binding.searchInput unitsViewModel.search(it.toString()) } binding.searchInputLayout.setEndIconOnClickListener { unfocusSearch(true) } } private fun showLayersPopUp(view: View) { val popOver = PopupMenu(this, view) popOver.menuInflater.inflate(R.menu.map_layers, popOver.menu) popOver.setOnMenuItemClickListener { item -> unitsViewModel.setMapLayer( when (item.itemId) { R.id.layerStreets -> getString(R.string.maps_streets_tile_url) R.id.layerSatellite -> getString(R.string.maps_satellite_url) R.id.layerHybrid -> getString(R.string.maps_hybrid_url) else -> getString(R.string.maps_streets_tile_url) } ) true } popOver.show() } private fun unfocusSearch(clearText: Boolean = false) { val manager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager manager.hideSoftInputFromWindow(binding.searchInput.windowToken, 0) if (clearText) { binding.searchInput.text?.clear() } binding.searchInput.clearFocus() } private fun setupObservers() { unitsViewModel.unitsDisplayMode.observe(this) { displayMode -> binding.displayModeToggle.setImageResource( when (displayMode) { UnitsViewModel.UnitsDisplayMode.LIST -> R.drawable.icon_map UnitsViewModel.UnitsDisplayMode.MAP -> R.drawable.icon_list else -> R.drawable.icon_map } ) binding.displayModeToggle.contentDescription = getString( when (displayMode) { UnitsViewModel.UnitsDisplayMode.LIST -> R.string.toggle_map UnitsViewModel.UnitsDisplayMode.MAP -> R.string.toggle_list else -> R.string.toggle_map } ) binding.mapLayerToggle.visibility = when (displayMode) { UnitsViewModel.UnitsDisplayMode.LIST -> View.GONE UnitsViewModel.UnitsDisplayMode.MAP -> View.VISIBLE else -> View.GONE } val newFragment = when (displayMode) { UnitsViewModel.UnitsDisplayMode.LIST -> devicesFragment UnitsViewModel.UnitsDisplayMode.MAP -> mapFragment else -> devicesFragment } supportFragmentManager.commit { replace(R.id.displayContainer, newFragment) } } unitsViewModel.selectedUnit.observe(this) { unfocusSearch(clearText = true) } } private fun removeObservers() { unitsViewModel.unitsDisplayMode.removeObservers(this) } }