refactor: Move version checks to Main.kt (#1995)

This commit is contained in:
James Rich
2025-05-31 20:36:35 -05:00
committed by GitHub
parent 8d231ff125
commit 6915249121
4 changed files with 51 additions and 32 deletions

View File

@@ -63,7 +63,6 @@ import com.geeksville.mesh.android.permissionMissing
import com.geeksville.mesh.android.shouldShowRequestPermissionRationale
import com.geeksville.mesh.concurrent.handledLaunch
import com.geeksville.mesh.model.BluetoothViewModel
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.navigation.DEEP_LINK_BASE_URI
import com.geeksville.mesh.service.MeshService
@@ -272,33 +271,6 @@ class MainActivity : AppCompatActivity(), Logging {
private fun onMeshConnectionChanged(newConnection: MeshService.ConnectionState) {
if (newConnection == MeshService.ConnectionState.CONNECTED) {
serviceRepository.meshService?.let { service ->
try {
val info: MyNodeInfo? = service.myNodeInfo // this can be null
if (info != null) {
val isOld = info.minAppVersion > BuildConfig.VERSION_CODE
if (isOld) {
model.showAlert(
getString(R.string.app_too_old),
getString(R.string.must_update),
dismissable = false,
)
} else {
// If we are already doing an update don't put up a dialog or try to get device info
val isUpdating = service.updateStatus >= 0
if (!isUpdating) {
val curVer = DeviceVersion(info.firmwareVersion ?: "0.0.0")
if (curVer < MeshService.minDeviceVersion) {
val title = getString(R.string.firmware_too_old)
val message = getString(R.string.firmware_old)
model.showAlert(title, message, dismissable = false)
}
}
}
}
} catch (ex: RemoteException) {
warn("Abandoning connect $ex, because we probably just lost device connection")
}
// if provideLocation enabled: Start providing location (from phone GPS) to mesh
if (model.provideLocation.value == true) {
service.startProvideLocation()
@@ -349,7 +321,6 @@ class MainActivity : AppCompatActivity(), Logging {
onConfirm = {
showAlertAppNotificationSettings()
},
dismissable = true
).also {
prefs.edit { putBoolean("dnd_rationale_shown", true) }
}

View File

@@ -221,7 +221,7 @@ class UIViewModel @Inject constructor(
html = html,
onConfirm = {
onConfirm?.invoke()
if (dismissable) dismissAlert()
dismissAlert()
},
onDismiss = {
if (dismissable) dismissAlert()

View File

@@ -48,6 +48,7 @@ import androidx.compose.material3.TooltipDefaults
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.rememberTooltipState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
@@ -56,6 +57,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.hilt.navigation.compose.hiltViewModel
@@ -68,7 +70,9 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.geeksville.mesh.BuildConfig
import com.geeksville.mesh.R
import com.geeksville.mesh.model.DeviceVersion
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.navigation.NavGraph
import com.geeksville.mesh.navigation.Route
@@ -112,6 +116,9 @@ fun MainScreen(
ScannedQrCodeDialog(viewModel, newChannelSet)
}
}
VersionChecks(viewModel)
val title by viewModel.title.collectAsStateWithLifecycle()
val alertDialogState by viewModel.currentAlert.collectAsStateWithLifecycle()
@@ -178,6 +185,47 @@ fun MainScreen(
}
}
@Composable
private fun VersionChecks(
viewModel: UIViewModel,
) {
val connectionState by viewModel.connectionState.collectAsStateWithLifecycle()
val myNodeInfo by viewModel.myNodeInfo.collectAsStateWithLifecycle()
val context = LocalContext.current
// Check if the device is running an old app version or firmware version
LaunchedEffect(connectionState, myNodeInfo) {
if (connectionState == MeshService.ConnectionState.CONNECTED) {
myNodeInfo?.let { info ->
val isOld = info.minAppVersion > BuildConfig.VERSION_CODE
val curVer = DeviceVersion(info.firmwareVersion ?: "0.0.0")
if (isOld) {
viewModel.showAlert(
context.getString(R.string.app_too_old),
context.getString(R.string.must_update),
dismissable = false,
onConfirm = {
val service = viewModel.meshService ?: return@showAlert
MeshService.changeDeviceAddress(context, service, "n")
}
)
} else if (curVer < MeshService.minDeviceVersion) {
val title = context.getString(R.string.firmware_too_old)
val message = context.getString(R.string.firmware_old)
viewModel.showAlert(
title = title,
message = message,
dismissable = false,
onConfirm = {
val service = viewModel.meshService ?: return@showAlert
MeshService.changeDeviceAddress(context, service, "n")
}
)
}
}
}
}
}
enum class MainMenuAction(@StringRes val stringRes: Int) {
DEBUG(R.string.debug_panel),
RADIO_CONFIG(R.string.radio_configuration),

View File

@@ -24,11 +24,11 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
@@ -55,7 +55,7 @@ fun SimpleAlertDialog(
style = SpanStyle(
textDecoration = TextDecoration.Underline,
fontStyle = FontStyle.Italic,
color = Color.Blue
color = MaterialTheme.colorScheme.tertiary
)
)
)