Add BuildConfigProvider (#3318)

This commit is contained in:
Phil Oliver 2025-10-03 17:24:52 -04:00 committed by GitHub
parent c1f411b2ad
commit e24292494e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 100 additions and 6 deletions

View file

@ -184,6 +184,7 @@ project.afterEvaluate { logger.lifecycle("Version code is set to: ${android.defa
dependencies {
implementation(projects.core.analytics)
implementation(projects.core.common)
implementation(projects.core.data)
implementation(projects.core.database)
implementation(projects.core.datastore)

View file

@ -256,7 +256,12 @@ fun MapView(mapViewModel: MapViewModel = hiltViewModel(), navigateToNodeDetails:
val geoPoints = nodesWithPosition.map { GeoPoint(it.latitude, it.longitude) }
BoundingBox.fromGeoPoints(geoPoints)
}
val map = rememberMapViewWithLifecycle(initialCameraView, loadOnlineTileSourceBase())
val map =
rememberMapViewWithLifecycle(
applicationId = mapViewModel.applicationId,
box = initialCameraView,
tileSource = loadOnlineTileSourceBase(),
)
val nodeClusterer = remember { RadiusMarkerClusterer(context) }

View file

@ -33,7 +33,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.LocalLifecycleOwner
import com.geeksville.mesh.BuildConfig
import org.meshtastic.feature.map.requiredZoomLevel
import org.osmdroid.config.Configuration
import org.osmdroid.tileprovider.tilesource.ITileSource
@ -74,6 +73,7 @@ private const val DEFAULT_ZOOM_LEVEL = 15.0
@Suppress("MagicNumber")
@Composable
internal fun rememberMapViewWithLifecycle(
applicationId: String,
box: BoundingBox,
tileSource: ITileSource = TileSourceFactory.DEFAULT_TILE_SOURCE,
): MapView {
@ -84,12 +84,18 @@ internal fun rememberMapViewWithLifecycle(
DEFAULT_ZOOM_LEVEL
}
val center = GeoPoint(box.centerLatitude, box.centerLongitude)
return rememberMapViewWithLifecycle(zoom, center, tileSource)
return rememberMapViewWithLifecycle(
applicationId = applicationId,
zoomLevel = zoom,
mapCenter = center,
tileSource = tileSource,
)
}
@Suppress("LongMethod")
@Composable
internal fun rememberMapViewWithLifecycle(
applicationId: String,
zoomLevel: Double = MIN_ZOOM_LEVEL,
mapCenter: GeoPoint = GeoPoint(0.0, 0.0),
tileSource: ITileSource = TileSourceFactory.DEFAULT_TILE_SOURCE,
@ -112,7 +118,7 @@ internal fun rememberMapViewWithLifecycle(
clipToOutline = true
// Required to get online tiles
Configuration.getInstance().userAgentValue = BuildConfig.APPLICATION_ID
Configuration.getInstance().userAgentValue = applicationId
setTileSource(tileSource)
isVerticalMapRepetitionEnabled = false // disables map repetition
setMultiTouchControls(true)

View file

@ -48,7 +48,12 @@ fun NodeMapScreen(
val state by metricsViewModel.state.collectAsStateWithLifecycle()
val geoPoints = state.positionLogs.map { GeoPoint(it.latitudeI * DEG_D, it.longitudeI * DEG_D) }
val cameraView = remember { BoundingBox.fromGeoPoints(geoPoints) }
val mapView = rememberMapViewWithLifecycle(cameraView, metricsViewModel.tileSource)
val mapView =
rememberMapViewWithLifecycle(
applicationId = nodeMapViewModel.applicationId,
box = cameraView,
tileSource = metricsViewModel.tileSource,
)
AndroidView(
modifier = Modifier.fillMaxSize(),

View file

@ -26,6 +26,8 @@ import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import org.meshtastic.core.common.BuildConfigProvider
import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module
@ -39,4 +41,15 @@ object ApplicationModule {
@Provides
fun providesMeshServiceNotifications(application: Application): MeshServiceNotifications =
MeshServiceNotifications(application)
@Singleton
@Provides
fun provideBuildConfigProvider(): BuildConfigProvider = object : BuildConfigProvider {
override val isDebug: Boolean = BuildConfig.DEBUG
override val applicationId: String = BuildConfig.APPLICATION_ID
override val versionCode: Int = BuildConfig.VERSION_CODE
override val versionName: String = BuildConfig.VERSION_NAME
override val absoluteMinFwVersion: String = BuildConfig.ABS_MIN_FW_VERSION
override val minFwVersion: String = BuildConfig.MIN_FW_VERSION
}
}

View file

@ -20,11 +20,15 @@ package com.geeksville.mesh.ui.map
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.StateFlow
import org.meshtastic.core.common.BuildConfigProvider
import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.database.model.Node
import javax.inject.Inject
@HiltViewModel
class NodeMapViewModel @Inject constructor(nodeRepository: NodeRepository) : ViewModel() {
class NodeMapViewModel @Inject constructor(nodeRepository: NodeRepository, buildConfigProvider: BuildConfigProvider) :
ViewModel() {
val ourNodeInfo: StateFlow<Node?> = nodeRepository.ourNodeInfo
val applicationId = buildConfigProvider.applicationId
}

View file

@ -68,6 +68,7 @@ dependencies {
kover(projects.meshServiceExample)
kover(projects.core.analytics)
kover(projects.core.common)
kover(projects.core.data)
kover(projects.core.datastore)
kover(projects.core.model)

View file

@ -0,0 +1,25 @@
/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
plugins {
alias(libs.plugins.meshtastic.android.library)
alias(libs.plugins.kover)
}
android { namespace = "org.meshtastic.core.common" }
dependencies {}

View file

@ -0,0 +1,28 @@
/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.meshtastic.core.common
interface BuildConfigProvider {
val isDebug: Boolean
val applicationId: String
val versionCode: Int
val versionName: String
val absoluteMinFwVersion: String
val minFwVersion: String
}

View file

@ -25,6 +25,7 @@ plugins {
android { namespace = "org.meshtastic.feature.map" }
dependencies {
implementation(projects.core.common)
implementation(projects.core.data)
implementation(projects.core.database)
implementation(projects.core.datastore)

View file

@ -22,6 +22,7 @@ import com.geeksville.mesh.LocalOnlyProtos.LocalConfig
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.stateIn
import org.meshtastic.core.common.BuildConfigProvider
import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.data.repository.PacketRepository
import org.meshtastic.core.data.repository.RadioConfigRepository
@ -39,6 +40,7 @@ constructor(
private val nodeRepository: NodeRepository,
serviceRepository: ServiceRepository,
radioConfigRepository: RadioConfigRepository,
buildConfigProvider: BuildConfigProvider,
) : BaseMapViewModel(mapPrefs, nodeRepository, packetRepository, serviceRepository) {
var mapStyleId: Int
@ -57,5 +59,7 @@ constructor(
val config
get() = localConfig.value
val applicationId = buildConfigProvider.applicationId
fun getUser(userId: String?) = nodeRepository.getUser(userId ?: DataPacket.ID_BROADCAST)
}

View file

@ -18,6 +18,7 @@
include(
":app",
":core:analytics",
":core:common",
":core:data",
":core:database",
":core:datastore",