diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index efebd43dd..bd4fe6a35 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -304,49 +304,62 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { } } else { // User just locked it, we should warn and then apply changes to radio - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.change_channel) - .setMessage(R.string.are_you_sure_channel) - .setNeutralButton(R.string.cancel) { _, _ -> - setGUIfromModel() + + model.channels.value?.primaryChannel?.let { oldPrimary -> + var newSettings = oldPrimary.settings.toBuilder() + val newName = binding.channelNameEdit.text.toString().trim() + + // Find the new modem config + val selectedModemPresetString = + binding.filledExposedDropdown.editableText.toString() + var newModemPreset = getModemPreset(selectedModemPresetString) + if (newModemPreset == ConfigProtos.Config.LoRaConfig.ModemPreset.UNRECOGNIZED) // Huh? didn't find it - keep same + newModemPreset = oldPrimary.loraConfig.modemPreset + + // Generate a new AES256 key if the user changes channel name or the name is non-default and the settings changed + val shouldUseRandomKey = + newName != originalName || (newName.isNotEmpty() && newModemPreset != oldPrimary.loraConfig.modemPreset) + if (shouldUseRandomKey) { + + // Install a new customized channel + debug("ASSIGNING NEW AES256 KEY") + val random = SecureRandom() + val bytes = ByteArray(32) + random.nextBytes(bytes) + newSettings.name = newName.take(11) // proto max_size:12 + newSettings.psk = ByteString.copyFrom(bytes) + } else { + debug("Switching back to default channel") + newSettings = Channel.default.settings.toBuilder() } - .setPositiveButton(getString(R.string.accept)) { _, _ -> - // Generate a new channel with only the changes the user can change in the GUI - model.channels.value?.primaryChannel?.let { oldPrimary -> - var newSettings = oldPrimary.settings.toBuilder() - val newName = binding.channelNameEdit.text.toString().trim() - // Find the new modem config - val selectedModemPresetString = - binding.filledExposedDropdown.editableText.toString() - var newModemPreset = getModemPreset(selectedModemPresetString) - if (newModemPreset == ConfigProtos.Config.LoRaConfig.ModemPreset.UNRECOGNIZED) // Huh? didn't find it - keep same - newModemPreset = oldPrimary.loraConfig.modemPreset + // No matter what apply the speed selection from the user + val newLoRaConfig = ConfigProtos.Config.LoRaConfig.newBuilder() + .setRegion(model.region) + .setModemPreset(newModemPreset) - // Generate a new AES256 key if the user changes channel name or the name is non-default and the settings changed - if (newName != originalName || (newName.isNotEmpty() && newModemPreset != oldPrimary.loraConfig.modemPreset)) { + val humanName = Channel(newSettings.build(), newLoRaConfig.build()).humanName + binding.channelNameEdit.setText(humanName) - // Install a new customized channel - debug("ASSIGNING NEW AES256 KEY") - val random = SecureRandom() - val bytes = ByteArray(32) - random.nextBytes(bytes) - newSettings.name = newName.take(11) // proto max_size:12 - newSettings.psk = ByteString.copyFrom(bytes) - } else { - debug("Switching back to default channel") - newSettings = Channel.default.settings.toBuilder() - } + val message = buildString { + append(getString(R.string.are_you_sure_channel)) + if (!shouldUseRandomKey) + append("\n\n" + getString(R.string.warning_default_psk).format(humanName)) + } - // No matter what apply the speed selection from the user - val newLoRaConfig = ConfigProtos.Config.LoRaConfig.newBuilder() - .setRegion(model.region) - .setModemPreset(newModemPreset) - - installSettings(newSettings.build(),newLoRaConfig.build()) + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.change_channel) + .setMessage(message) + .setNeutralButton(R.string.cancel) { _, _ -> + setGUIfromModel() } - } - .show() + .setPositiveButton(getString(R.string.accept)) { _, _ -> + // Generate a new channel with only the changes the user can change in the GUI + + installSettings(newSettings.build(), newLoRaConfig.build()) + } + .show() + } } onEditingChanged() // update GUI on what user is allowed to edit/share diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ede3709cf..58a385dee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,4 +155,5 @@ Message Append to message Instantly send + Empty channel names use the default encryption key (any device on %s can read your messages).