diff --git a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt index 2588fa367..96e230765 100644 --- a/app/src/main/java/com/geeksville/mesh/NodeInfo.kt +++ b/app/src/main/java/com/geeksville/mesh/NodeInfo.kt @@ -2,6 +2,7 @@ package com.geeksville.mesh import android.graphics.Color import android.os.Parcelable +import com.geeksville.mesh.MeshProtos.User import com.geeksville.mesh.util.bearing import com.geeksville.mesh.util.latLongToMeter import com.geeksville.mesh.util.anonymize @@ -27,6 +28,9 @@ data class MeshUser( return "MeshUser(id=${id.anonymize}, longName=${longName.anonymize}, shortName=${shortName.anonymize}, hwModel=${hwModelString}, isLicensed=${isLicensed})" } + fun toProto(): User = User.newBuilder().setId(id).setLongName(longName).setShortName(shortName) + .setHwModel(hwModel).setIsLicensed(isLicensed).build() + /** a string version of the hardware model, converted into pretty lowercase and changing _ to -, and p to dot * or null if unset * */ 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 93628c731..6800bf8d7 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -426,8 +426,6 @@ class UIViewModel @Inject constructor( try { // Pull down our real node ID - This must be done AFTER reading the nodedb because we need the DB to find our nodeinof object nodeDB.setMyId(service.myId) - val ownerName = nodes[service.myId]?.user?.longName - _ownerName.value = ownerName } catch (ex: Exception) { warn("Ignoring failure to get myId, service is probably just uninited... ${ex.message}") } @@ -520,12 +518,6 @@ class UIViewModel @Inject constructor( } } - /// our name in hte radio - /// Note, we generate owner initials automatically for now - /// our activity will read this from prefs or set it to the empty string - private val _ownerName = MutableLiveData() - val ownerName: LiveData get() = _ownerName - val provideLocation = object : MutableLiveData(preferences.getBoolean("provide-location", false)) { override fun setValue(value: Boolean) { super.setValue(value) @@ -536,22 +528,8 @@ class UIViewModel @Inject constructor( } } - fun setOwner(user: MeshUser) = with(user) { - - longName.trim().let { ownerName -> - // note: we allow an empty user string to be written to prefs - _ownerName.value = ownerName - preferences.edit { putString("owner", ownerName) } - } - - // Note: we are careful to not set a new unique ID - if (_ownerName.value!!.isNotEmpty()) - try { - // Note: we use ?. here because we might be running in the emulator - meshService?.setOwner(user) - } catch (ex: RemoteException) { - errormsg("Can't set username on device, is device offline? ${ex.message}") - } + fun setOwner(user: User) { + setRemoteOwner(myNodeNum ?: return, user) } fun setRemoteOwner(destNum: Int, user: User) { @@ -726,7 +704,7 @@ class UIViewModel @Inject constructor( longName = if (hasLongName()) longName else it.longName, shortName = if (hasShortName()) shortName else it.shortName ) - setOwner(user) + setOwner(user.toProto()) } if (hasChannelUrl()) { setChannels(ChannelSet(Uri.parse(channelUrl))) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index bba925f78..07a70c996 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -280,7 +280,8 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { regionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinner.adapter = regionAdapter - model.ownerName.observe(viewLifecycleOwner) { name -> + model.ourNodeInfo.asLiveData().observe(viewLifecycleOwner) { node -> + val name = node?.user?.longName binding.usernameEditText.isEnabled = !name.isNullOrEmpty() && !model.isManaged binding.usernameEditText.setText(name) } @@ -361,7 +362,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { val n = binding.usernameEditText.text.toString().trim() model.ourNodeInfo.value?.user?.let { val user = it.copy(longName = n, shortName = getInitials(n)) - if (n.isNotEmpty()) model.setOwner(user) + if (n.isNotEmpty()) model.setOwner(user.toProto()) } requireActivity().hideKeyboard() }