feat: add menu item to add/remove nodes from `ignoreIncomingList`

pull/693/head
andrekir 2023-08-25 19:14:24 -03:00 zatwierdzone przez Andre K
rodzic c3ec67a9ba
commit ac3190e944
4 zmienionych plików z 61 dodań i 1 usunięć

Wyświetl plik

@ -394,6 +394,15 @@ class UIViewModel @Inject constructor(
updateLoraConfig { it.copy { region = value } }
}
var ignoreIncomingList: MutableList<Int>
get() = config.lora.ignoreIncomingList
set(value) = updateLoraConfig {
it.copy {
ignoreIncoming.clear()
ignoreIncoming.addAll(value)
}
}
fun gpsString(p: Position): String {
return when (config.display.gpsFormat) {
Config.DisplayConfig.GpsCoordinateFormat.DEC -> GPSFormat.DEC(p)

Wyświetl plik

@ -2,7 +2,9 @@ package com.geeksville.mesh.ui
import android.content.res.ColorStateList
import android.os.Bundle
import android.text.SpannableString
import android.text.method.LinkMovementMethod
import android.text.style.StrikethroughSpan
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
@ -54,17 +56,29 @@ class UsersFragment : ScreenFragment("Users"), Logging {
private val nodesAdapter = object : RecyclerView.Adapter<ViewHolder>() {
private var nodes = arrayOf<NodeInfo>()
val ignoreIncomingList: MutableList<Int> = mutableListOf()
private fun CharSequence.strike() = SpannableString(this).apply {
setSpan(StrikethroughSpan(), 0, this.length, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE)
}
private fun CharSequence.strikeIf(isIgnored: Boolean) = if (isIgnored) strike() else this
private fun popup(view: View, position: Int) {
if (!model.isConnected()) return
val node = nodes[position]
val user = node.user ?: return
val showAdmin = position == 0 || model.adminChannelIndex > 0
val isIgnored = ignoreIncomingList.contains(node.num)
val popup = PopupMenu(requireContext(), view)
popup.inflate(R.menu.menu_nodes)
popup.menu.setGroupVisible(R.id.group_remote, position > 0)
popup.menu.setGroupVisible(R.id.group_admin, showAdmin)
popup.menu.setGroupEnabled(R.id.group_admin, !model.isManaged)
popup.menu.findItem(R.id.ignore).apply {
isEnabled = ignoreIncomingList.size < 3
isChecked = isIgnored
}
popup.setOnMenuItemClickListener { item: MenuItem ->
when (item.itemId) {
R.id.direct_message -> {
@ -89,6 +103,27 @@ class UsersFragment : ScreenFragment("Users"), Logging {
debug("requesting traceroute for '${user.longName}'")
model.requestTraceroute(node.num)
}
R.id.ignore -> {
val message = if (isIgnored) R.string.ignore_remove else R.string.ignore_add
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.ignore)
.setMessage(getString(message, user.longName))
.setNeutralButton(R.string.cancel) { _, _ -> }
.setPositiveButton(R.string.send) { _, _ ->
model.ignoreIncomingList = ignoreIncomingList.apply {
if (isIgnored) {
debug("removed '${user.longName}' from ignore list")
remove(node.num)
} else {
debug("added '${user.longName}' to ignore list")
add(node.num)
}
}
item.isChecked = !item.isChecked
notifyItemChanged(position)
}
.show()
}
R.id.remote_admin -> {
debug("calling remote admin --> destNum: ${node.num.toUInt()}")
parentFragmentManager.beginTransaction()
@ -167,8 +202,9 @@ class UsersFragment : ScreenFragment("Users"), Logging {
val n = nodes[position]
val user = n.user
val (textColor, nodeColor) = n.colors
val isIgnored: Boolean = ignoreIncomingList.contains(n.num)
with(holder.chipNode) {
text = user?.shortName ?: "UNK"
text = (user?.shortName ?: "UNK").strikeIf(isIgnored)
chipBackgroundColor = ColorStateList.valueOf(nodeColor)
setTextColor(textColor)
}
@ -285,6 +321,13 @@ class UsersFragment : ScreenFragment("Users"), Logging {
nodesAdapter.onNodesChanged(it.perhapsReindexBy(model.myNodeNum))
}
model.localConfig.asLiveData().observe(viewLifecycleOwner) { config ->
nodesAdapter.ignoreIncomingList.apply {
clear()
addAll(config.lora.ignoreIncomingList)
}
}
model.packetResponse.asLiveData().observe(viewLifecycleOwner) { meshLog ->
meshLog?.meshPacket?.let { meshPacket ->
val routeList = meshLog.routeDiscovery?.routeList ?: return@let

Wyświetl plik

@ -14,6 +14,11 @@
android:id="@+id/traceroute"
android:title="@string/traceroute"
app:showAsAction="withText" />
<item
android:id="@+id/ignore"
android:checkable="true"
android:checked="false"
android:title="@string/ignore" />
</group>
<group android:id="@+id/group_admin">
<item

Wyświetl plik

@ -150,6 +150,9 @@
<string name="direct_message">Direct Message</string>
<string name="nodedb_reset">NodeDB reset</string>
<string name="nodedb_reset_description">This will clear all nodes from this list.</string>
<string name="ignore">Ignore</string>
<string name="ignore_add">Add \'%s\' to ignore list? Your radio will reboot after making this change.</string>
<string name="ignore_remove">Remove \'%s\' from ignore list? Your radio will reboot after making this change.</string>
<string name="map_select_download_region">Select download region</string>
<string name="map_5_miles">5 Miles</string>
<string name="map_10_miles">10 miles</string>