diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index f9e223ad2..7cccfc640 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -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) } } diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 612c7ee75..626f7f345 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -221,7 +221,7 @@ class UIViewModel @Inject constructor( html = html, onConfirm = { onConfirm?.invoke() - if (dismissable) dismissAlert() + dismissAlert() }, onDismiss = { if (dismissable) dismissAlert() diff --git a/app/src/main/java/com/geeksville/mesh/ui/Main.kt b/app/src/main/java/com/geeksville/mesh/ui/Main.kt index 649d19f4b..2197bea60 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/Main.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/Main.kt @@ -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), diff --git a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt index 6573395e5..a80760730 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/common/components/AlertDialogs.kt @@ -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 ) ) )