Skip to content

Commit 2a362b4

Browse files
committed
extract status bar logic
1 parent 7126109 commit 2a362b4

2 files changed

Lines changed: 115 additions & 94 deletions

File tree

app/src/main/kotlin/org/btcmap/map/MapFragment.kt

Lines changed: 58 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,30 @@ class MapFragment : Fragment() {
179179
return binding.root
180180
}
181181

182-
private fun initSearchBar(binding: MapFragmentBinding) {
182+
private suspend fun selectPlace(place: Place?) {
183+
if (place != null) {
184+
getPlaceDetailsToolbar()
185+
placeFragment.setPlace(place)
186+
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
187+
} else {
188+
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
189+
}
190+
}
191+
192+
var statusBarController: MapStatusBarController? = null
193+
194+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
195+
bottomSheetBehavior = BottomSheetBehavior.from(binding.elementDetails)
196+
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
197+
bottomSheetBehavior.addSlideCallback()
198+
199+
statusBarController = MapStatusBarController(
200+
conf = resources.configuration,
201+
insetsController = insetsController!!,
202+
bottomSheetBehavior = bottomSheetBehavior
203+
)
204+
statusBarController?.onViewCreated()
205+
183206
binding.searchBar.setOnMenuItemClickListener {
184207
when (it.itemId) {
185208
R.id.add_place -> {
@@ -199,50 +222,8 @@ class MapFragment : Fragment() {
199222

200223
true
201224
}
202-
}
203225

204-
private suspend fun selectPlace(place: Place?) {
205-
if (place != null) {
206-
getPlaceDetailsToolbar()
207-
placeFragment.setPlace(place)
208-
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HALF_EXPANDED
209-
} else {
210-
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
211-
}
212-
}
213-
214-
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
215-
val merchantLayers = createMerchantLayers(
216-
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
217-
markerBadgeBackgroundColor = prefs.badgeBackgroundColor(requireContext()),
218-
markerBadgeTextColor = prefs.badgeTextColor(requireContext()),
219-
usingOpenFreeMap = usingOpenFreeMap(),
220-
)
221-
val eventLayers = createEventLayers(
222-
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
223-
usingOpenFreeMap = usingOpenFreeMap(),
224-
)
225-
val exchangeLayers = createExchangeLayers(
226-
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
227-
markerBadgeBackgroundColor = prefs.badgeBackgroundColor(requireContext()),
228-
markerBadgeTextColor = prefs.badgeTextColor(requireContext()),
229-
usingOpenFreeMap = usingOpenFreeMap(),
230-
)
231-
merchantsSource = merchantLayers.first
232-
eventsSource = eventLayers.first
233-
exchangesSource = exchangeLayers.first
234-
binding.map.getMapAsync { map ->
235-
map.getStyle { style ->
236-
style.addSource(merchantLayers.first)
237-
merchantLayers.second.forEach { style.addLayer(it) }
238-
style.addSource(eventLayers.first)
239-
eventLayers.second.forEach { style.addLayer(it) }
240-
style.addSource(exchangeLayers.first)
241-
exchangeLayers.second.forEach { style.addLayer(it) }
242-
}
243-
}
244-
245-
initSearchBar(binding)
226+
addMapDatSourceAndLayersAsync()
246227

247228
launchUpdateChecker()
248229

@@ -307,10 +288,6 @@ class MapFragment : Fragment() {
307288
}
308289
}
309290

310-
bottomSheetBehavior = BottomSheetBehavior.from(binding.elementDetails)
311-
bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN
312-
bottomSheetBehavior.addSlideCallback()
313-
314291
viewLifecycleOwner.lifecycleScope.launch {
315292
val elementDetailsToolbar = getPlaceDetailsToolbar() ?: return@launch
316293
bottomSheetBehavior.peekHeight = elementDetailsToolbar.height * 3
@@ -485,16 +462,44 @@ class MapFragment : Fragment() {
485462
}
486463
}
487464
}
465+
}
488466

489-
// viewLifecycleOwner.lifecycleScope.launch {
490-
// val merchants =
491-
// withContext(Dispatchers.IO) { PlaceQueries.selectMerchants(db).toGeoJson() }
492-
// merchantsSource.setGeoJson(merchants)
493-
// }
467+
private fun addMapDatSourceAndLayersAsync() {
468+
val merchantLayers = createMerchantLayers(
469+
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
470+
markerBadgeBackgroundColor = prefs.badgeBackgroundColor(requireContext()),
471+
markerBadgeTextColor = prefs.badgeTextColor(requireContext()),
472+
usingOpenFreeMap = usingOpenFreeMap(),
473+
)
474+
val eventLayers = createEventLayers(
475+
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
476+
usingOpenFreeMap = usingOpenFreeMap(),
477+
)
478+
val exchangeLayers = createExchangeLayers(
479+
markerBackgroundColor = prefs.markerBackgroundColor(requireContext()),
480+
markerBadgeBackgroundColor = prefs.badgeBackgroundColor(requireContext()),
481+
markerBadgeTextColor = prefs.badgeTextColor(requireContext()),
482+
usingOpenFreeMap = usingOpenFreeMap(),
483+
)
484+
merchantsSource = merchantLayers.first
485+
eventsSource = eventLayers.first
486+
exchangesSource = exchangeLayers.first
487+
binding.map.getMapAsync { map ->
488+
map.getStyle { style ->
489+
style.addSource(merchantLayers.first)
490+
merchantLayers.second.forEach { style.addLayer(it) }
491+
style.addSource(eventLayers.first)
492+
eventLayers.second.forEach { style.addLayer(it) }
493+
style.addSource(exchangeLayers.first)
494+
exchangeLayers.second.forEach { style.addLayer(it) }
495+
}
496+
}
494497
}
495498

496499
override fun onDestroyView() {
497500
super.onDestroyView()
501+
statusBarController?.onDestroyView()
502+
statusBarController = null
498503
_binding = null
499504
}
500505

@@ -581,18 +586,13 @@ class MapFragment : Fragment() {
581586
private fun BottomSheetBehavior<*>.addSlideCallback() {
582587
addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
583588
override fun onStateChanged(bottomSheet: View, newState: Int) {
584-
if (newState == BottomSheetBehavior.STATE_EXPANDED) {
585-
styleStatusBar()
586-
}
587-
588589
if (newState == BottomSheetBehavior.STATE_HIDDEN) {
589590
viewLifecycleOwner.lifecycleScope.launch { selectPlace(null) }
590591
}
591592
}
592593

593594
override fun onSlide(bottomSheet: View, slideOffset: Float) {
594595
placeFragment.onSlide(slideOffset)
595-
styleStatusBar()
596596
}
597597
})
598598
}
@@ -615,42 +615,6 @@ class MapFragment : Fragment() {
615615
return placeFragment.requireView().findViewById(R.id.toolbar)!!
616616
}
617617

618-
override fun onResume() {
619-
super.onResume()
620-
styleStatusBar()
621-
}
622-
623-
override fun onPause() {
624-
super.onPause()
625-
restoreDefaultStatusBar()
626-
}
627-
628-
fun styleStatusBar() {
629-
val nightMode =
630-
requireContext().resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
631-
632-
if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) {
633-
insetsController?.isAppearanceLightStatusBars = !nightMode
634-
} else {
635-
when (prefs.mapStyle) {
636-
MapStyle.Auto -> {
637-
insetsController?.isAppearanceLightStatusBars = !nightMode
638-
}
639-
640-
MapStyle.Dark,
641-
MapStyle.CartoDarkMatter -> insetsController?.isAppearanceLightStatusBars = false
642-
643-
else -> insetsController?.isAppearanceLightStatusBars = true
644-
}
645-
}
646-
}
647-
648-
fun restoreDefaultStatusBar() {
649-
val nightMode =
650-
requireContext().resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
651-
insetsController?.isAppearanceLightStatusBars = !nightMode
652-
}
653-
654618
private fun List<Marker>.toGeoJson(): String {
655619
val sb = StringBuilder()
656620
sb.append(
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.btcmap.map
2+
3+
import android.content.res.Configuration
4+
import android.util.Log
5+
import android.view.View
6+
import androidx.core.view.WindowInsetsControllerCompat
7+
import com.google.android.material.bottomsheet.BottomSheetBehavior
8+
import org.btcmap.settings.MapStyle
9+
import org.btcmap.settings.mapStyle
10+
import org.btcmap.settings.prefs
11+
12+
class MapStatusBarController(
13+
private val conf: Configuration,
14+
private val insetsController: WindowInsetsControllerCompat,
15+
private val bottomSheetBehavior: BottomSheetBehavior<*>,
16+
) {
17+
val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
18+
override fun onStateChanged(bottomSheet: View, newState: Int) {
19+
syncStatusBar(bottomSheetBehavior.state)
20+
}
21+
22+
override fun onSlide(bottomSheet: View, slideOffset: Float) {
23+
syncStatusBar(bottomSheetBehavior.state)
24+
}
25+
}
26+
27+
fun onViewCreated() {
28+
syncStatusBar(BottomSheetBehavior.STATE_COLLAPSED)
29+
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback)
30+
}
31+
32+
fun onDestroyView() {
33+
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallback)
34+
syncStatusBar(BottomSheetBehavior.STATE_EXPANDED)
35+
}
36+
37+
private fun syncStatusBar(bottomSheetState: Int) {
38+
Log.d("map_status_bar", "syncing")
39+
val nightMode =
40+
conf.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
41+
42+
if (bottomSheetState == BottomSheetBehavior.STATE_EXPANDED) {
43+
insetsController.isAppearanceLightStatusBars = !nightMode
44+
} else {
45+
when (prefs.mapStyle) {
46+
MapStyle.Auto -> {
47+
insetsController.isAppearanceLightStatusBars = !nightMode
48+
}
49+
50+
MapStyle.Dark,
51+
MapStyle.CartoDarkMatter -> insetsController.isAppearanceLightStatusBars = false
52+
53+
else -> insetsController.isAppearanceLightStatusBars = true
54+
}
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)