diff --git a/TODO.md b/TODO.md index 5bf41ae0e..e0d620d0c 100644 --- a/TODO.md +++ b/TODO.md @@ -37,7 +37,6 @@ the channel is encrypted, you can share the the channel key with others by qr co * keep past messages in db, one db per channel (currently we just keep an array in saved preferences) * show user avatars in chat (use the google user info api) * let users save old channels (i.e. have a menu of channels the user can use) -* also add a receiver that fires after a new update was installed from the play store * if the rxpacket queue on the device overflows (because android hasn't connected in a while) send a special packet to android which means 'X packets have been dropped because you were offline' -drop oldest packets first * make sw update work over BLE diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 343f5515d..7dd67e5fb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -149,6 +149,7 @@ + @@ -160,6 +161,15 @@ + + + + + + diff --git a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt index 76b5a31b3..a35eff231 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/MapFragment.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import com.geeksville.android.GeeksvilleApplication import com.geeksville.android.Logging import com.geeksville.mesh.NodeInfo @@ -130,7 +131,12 @@ class MapFragment : ScreenFragment("Map"), Logging { } var mapView: MapView? = null - var mapboxMap: MapboxMap? = null + + /** + * Mapbox native code can crash painfully if you ever call a mapbox view function while the view is not actively being show + */ + private val isViewVisible: Boolean + get() = view != null && isResumed override fun onViewCreated(viewIn: View, savedInstanceState: Bundle?) { super.onViewCreated(viewIn, savedInstanceState) @@ -145,7 +151,6 @@ class MapFragment : ScreenFragment("Map"), Logging { // Each time the pane is shown start fetching new map info (we do this here instead of // onCreate because getMapAsync can die in native code if the view goes away) v.getMapAsync { map -> - mapboxMap = map if (view != null) { // it might have gone away by now // val markerIcon = BitmapFactory.decodeResource(context.resources, R.drawable.ic_twotone_person_pin_24) @@ -161,7 +166,19 @@ class MapFragment : ScreenFragment("Map"), Logging { //map.uiSettings.isScrollGesturesEnabled = true //map.uiSettings.isZoomGesturesEnabled = true + + // Provide initial positions + model.nodeDB.nodes.value?.let { nodes -> + onNodesChanged(map, nodes.values) + } } + + // Any times nodes change update our map + model.nodeDB.nodes.observe(viewLifecycleOwner, Observer { nodes -> + debug("Nodes updated! map visible = $isViewVisible") + if (isViewVisible) + onNodesChanged(map, nodes.values) + }) } } } @@ -185,16 +202,6 @@ class MapFragment : ScreenFragment("Map"), Logging { override fun onResume() { super.onResume() mapView?.onResume() - - // FIXME: for now we just set the node positions when the user pages to the map - because - // otherwise we try to update in the background which breaks mapbox native code (when view is not shown - mapboxMap?.let { map -> - // model.nodeDB.nodes.observe(viewLifecycleOwner, Observer { nodes -> - model.nodeDB.nodes.value?.values?.let { - onNodesChanged(map, it) - } - //}) - } } override fun onDestroy() { diff --git a/geeksville-androidlib b/geeksville-androidlib index 99dbf61fa..ab381a83f 160000 --- a/geeksville-androidlib +++ b/geeksville-androidlib @@ -1 +1 @@ -Subproject commit 99dbf61fad087db910be7f74867a8f14aba877a4 +Subproject commit ab381a83f5380358fa8412a58635e390c3729192