refactor: handle MapView Lifecycle

pull/679/head
andrekir 2023-08-04 17:16:42 -03:00
rodzic fce97997d8
commit 0a47b8df3e
2 zmienionych plików z 25 dodań i 15 usunięć

Wyświetl plik

@ -57,7 +57,7 @@ import com.geeksville.mesh.ui.map.components.CacheLayout
import com.geeksville.mesh.ui.map.components.DownloadButton import com.geeksville.mesh.ui.map.components.DownloadButton
import com.geeksville.mesh.ui.map.components.EditWaypointDialog import com.geeksville.mesh.ui.map.components.EditWaypointDialog
import com.geeksville.mesh.ui.components.IconButton import com.geeksville.mesh.ui.components.IconButton
import com.geeksville.mesh.util.EnableWakeLock import com.geeksville.mesh.ui.map.components.rememberMapViewWithLifecycle
import com.geeksville.mesh.util.SqlTileWriterExt import com.geeksville.mesh.util.SqlTileWriterExt
import com.geeksville.mesh.util.requiredZoomLevel import com.geeksville.mesh.util.requiredZoomLevel
import com.geeksville.mesh.util.formatAgo import com.geeksville.mesh.util.formatAgo
@ -147,13 +147,7 @@ fun MapView(model: UIViewModel = viewModel()) {
val hasGps = context.hasGps() val hasGps = context.hasGps()
EnableWakeLock(context) val map = rememberMapViewWithLifecycle(context)
val map = remember {
MapView(context).apply {
clipToOutline = true
}
}
fun toggleMyLocation() { fun toggleMyLocation() {
if (context.gpsDisabled()) { if (context.gpsDisabled()) {

Wyświetl plik

@ -1,14 +1,16 @@
package com.geeksville.mesh.util package com.geeksville.mesh.ui.map.components
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.PowerManager import android.os.PowerManager
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleEventObserver
import com.geeksville.mesh.android.BuildUtils.errormsg import com.geeksville.mesh.android.BuildUtils.errormsg
import org.osmdroid.views.MapView
@SuppressLint("WakelockTimeout") @SuppressLint("WakelockTimeout")
private fun PowerManager.WakeLock.safeAcquire() { private fun PowerManager.WakeLock.safeAcquire() {
@ -29,23 +31,35 @@ private fun PowerManager.WakeLock.safeRelease() {
} }
} }
@SuppressLint("InvalidWakeLockTag")
@Composable @Composable
fun EnableWakeLock(context: Context) { fun rememberMapViewWithLifecycle(context: Context): MapView {
val mapView = remember {
MapView(context).apply {
clipToOutline = true
}
}
val lifecycle = LocalLifecycleOwner.current.lifecycle val lifecycle = LocalLifecycleOwner.current.lifecycle
DisposableEffect(lifecycle) {
DisposableEffect(Unit) {
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@SuppressLint("InvalidWakeLockTag")
val wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenLock") val wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenLock")
wakeLock.safeAcquire() wakeLock.safeAcquire()
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
when (event) { when (event) {
Lifecycle.Event.ON_PAUSE -> wakeLock.safeRelease() Lifecycle.Event.ON_PAUSE -> {
Lifecycle.Event.ON_RESUME -> wakeLock.safeAcquire() wakeLock.safeRelease()
mapView.onPause()
}
Lifecycle.Event.ON_RESUME -> {
wakeLock.safeAcquire()
mapView.onResume()
}
else -> {} else -> {}
} }
} }
@ -55,6 +69,8 @@ fun EnableWakeLock(context: Context) {
onDispose { onDispose {
lifecycle.removeObserver(observer) lifecycle.removeObserver(observer)
wakeLock.safeRelease() wakeLock.safeRelease()
mapView.onDetach()
} }
} }
return mapView
} }