mirror of
https://github.com/markqvist/Sideband.git
synced 2025-07-22 06:29:14 -04:00
Voice call UI additions
This commit is contained in:
parent
9e058cc12e
commit
b1678a1532
4 changed files with 63 additions and 4 deletions
|
@ -1096,6 +1096,10 @@ class SidebandApp(MDApp):
|
||||||
self.hw_error_dialog.open()
|
self.hw_error_dialog.open()
|
||||||
self.hw_error_dialog.is_open = True
|
self.hw_error_dialog.is_open = True
|
||||||
|
|
||||||
|
incoming_call = self.sideband.getstate("voice.incoming_call")
|
||||||
|
if incoming_call:
|
||||||
|
self.sideband.setstate("voice.incoming_call", None)
|
||||||
|
toast(f"Call from {incoming_call}", duration=7)
|
||||||
|
|
||||||
if self.root.ids.screen_manager.current == "messages_screen":
|
if self.root.ids.screen_manager.current == "messages_screen":
|
||||||
self.messages_view.update()
|
self.messages_view.update()
|
||||||
|
@ -1370,6 +1374,15 @@ class SidebandApp(MDApp):
|
||||||
if text == "o":
|
if text == "o":
|
||||||
self.objects_action()
|
self.objects_action()
|
||||||
|
|
||||||
|
if text == "e":
|
||||||
|
self.voice_action()
|
||||||
|
|
||||||
|
if text == " ":
|
||||||
|
self.voice_answer_action()
|
||||||
|
|
||||||
|
if text == ".":
|
||||||
|
self.voice_reject_action()
|
||||||
|
|
||||||
if text == "r":
|
if text == "r":
|
||||||
if self.root.ids.screen_manager.current == "conversations_screen":
|
if self.root.ids.screen_manager.current == "conversations_screen":
|
||||||
if self.include_objects:
|
if self.include_objects:
|
||||||
|
@ -5309,6 +5322,16 @@ class SidebandApp(MDApp):
|
||||||
def dial_action(self, identity_hash):
|
def dial_action(self, identity_hash):
|
||||||
self.voice_action(dial_on_complete=identity_hash)
|
self.voice_action(dial_on_complete=identity_hash)
|
||||||
|
|
||||||
|
def voice_answer_action(self, sender=None):
|
||||||
|
if self.sideband.voice_running:
|
||||||
|
if self.sideband.telephone.is_ringing: self.sideband.telephone.answer()
|
||||||
|
|
||||||
|
def voice_reject_action(self, sender=None):
|
||||||
|
if self.sideband.voice_running:
|
||||||
|
if self.sideband.telephone.is_ringing or self.sideband.telephone.is_in_call:
|
||||||
|
self.sideband.telephone.hangup()
|
||||||
|
toast("Call ended")
|
||||||
|
|
||||||
### Telemetry Screen
|
### Telemetry Screen
|
||||||
######################################
|
######################################
|
||||||
|
|
||||||
|
@ -6241,15 +6264,21 @@ If you use Reticulum and LXMF on hardware that does not carry any identifiers ti
|
||||||
- [b]Ctrl-Shift-F[/b] add file
|
- [b]Ctrl-Shift-F[/b] add file
|
||||||
- [b]Ctrl-D[/b] or [b]Ctrl-S[/b] Send message
|
- [b]Ctrl-D[/b] or [b]Ctrl-S[/b] Send message
|
||||||
|
|
||||||
[b]Voice & PTT[/b]
|
[b]Voice & PTT Messages[/b]
|
||||||
- [b]Space[/b] Start/stop recording
|
- [b]Space[/b] Start/stop recording
|
||||||
- [b]Enter[/b] Save recording to message
|
- [b]Enter[/b] Save recording to message
|
||||||
- With PTT enabled, hold [b]Space[/b] to talk
|
- With PTT enabled, hold [b]Space[/b] to talk
|
||||||
|
|
||||||
|
[b]Voice Calls[/b]
|
||||||
|
- [b]Ctrl-Space[/b] Answer incoming call
|
||||||
|
- [b]Ctrl-.[/b] Reject incoming call
|
||||||
|
- [b]Ctrl-.[/b] Hang up active call
|
||||||
|
|
||||||
[b]Navigation[/b]
|
[b]Navigation[/b]
|
||||||
- [b]Ctrl-[i]n[/i][/b] Go to conversation number [i]n[/i]
|
- [b]Ctrl-[i]n[/i][/b] Go to conversation number [i]n[/i]
|
||||||
- [b]Ctrl-R[/b] Go to Conversations
|
- [b]Ctrl-R[/b] Go to Conversations
|
||||||
- [b]Ctrl-O[/b] Go to Objects & Devices
|
- [b]Ctrl-O[/b] Go to Objects & Devices
|
||||||
|
- [b]Ctrl-E[/b] Go to Voice
|
||||||
- [b]Ctrl-L[/b] Go to Announce Stream
|
- [b]Ctrl-L[/b] Go to Announce Stream
|
||||||
- [b]Ctrl-M[/b] Go to Situation Map
|
- [b]Ctrl-M[/b] Go to Situation Map
|
||||||
- [b]Ctrl-U[/b] Go to Utilities
|
- [b]Ctrl-U[/b] Go to Utilities
|
||||||
|
|
|
@ -1224,6 +1224,27 @@ class SidebandCore():
|
||||||
RNS.log("Could not decode a valid peer name from data: "+str(e), RNS.LOG_DEBUG)
|
RNS.log("Could not decode a valid peer name from data: "+str(e), RNS.LOG_DEBUG)
|
||||||
return RNS.prettyhexrep(context_dest)
|
return RNS.prettyhexrep(context_dest)
|
||||||
|
|
||||||
|
def voice_display_name(self, identity_hash):
|
||||||
|
context_dest = identity_hash
|
||||||
|
if context_dest == self.lxmf_destination.hash:
|
||||||
|
return self.config["display_name"]
|
||||||
|
|
||||||
|
try:
|
||||||
|
lxmf_destination_hash = RNS.Destination.hash_from_name_and_identity("lxmf.delivery", identity_hash)
|
||||||
|
existing_voice = self._db_conversation(context_dest)
|
||||||
|
existing_lxmf = self._db_conversation(lxmf_destination_hash)
|
||||||
|
|
||||||
|
print(RNS.prettyhexrep(lxmf_destination_hash))
|
||||||
|
print(f"VOICE {existing_voice}")
|
||||||
|
print(f"LXMF {existing_lxmf}")
|
||||||
|
|
||||||
|
if existing_lxmf: return self.peer_display_name(lxmf_destination_hash)
|
||||||
|
else: return self.peer_display_name(identity_hash)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
RNS.log("Could not decode a valid peer name from data: "+str(e), RNS.LOG_DEBUG)
|
||||||
|
return RNS.prettyhexrep(context_dest)
|
||||||
|
|
||||||
def clear_conversation(self, context_dest):
|
def clear_conversation(self, context_dest):
|
||||||
self._db_clear_conversation(context_dest)
|
self._db_clear_conversation(context_dest)
|
||||||
|
|
||||||
|
@ -5220,7 +5241,7 @@ class SidebandCore():
|
||||||
RNS.log("Starting voice service", RNS.LOG_DEBUG)
|
RNS.log("Starting voice service", RNS.LOG_DEBUG)
|
||||||
self.voice_running = True
|
self.voice_running = True
|
||||||
from .voice import ReticulumTelephone
|
from .voice import ReticulumTelephone
|
||||||
self.telephone = ReticulumTelephone(self.identity)
|
self.telephone = ReticulumTelephone(self.identity, owner=self)
|
||||||
ringtone_path = os.path.join(self.asset_dir, "audio", "notifications", "soft1.opus")
|
ringtone_path = os.path.join(self.asset_dir, "audio", "notifications", "soft1.opus")
|
||||||
self.telephone.set_ringtone(ringtone_path)
|
self.telephone.set_ringtone(ringtone_path)
|
||||||
|
|
||||||
|
@ -5244,6 +5265,10 @@ class SidebandCore():
|
||||||
RNS.log(f"An error occurred while stopping voice services, the contained exception was: {e}", RNS.LOG_ERROR)
|
RNS.log(f"An error occurred while stopping voice services, the contained exception was: {e}", RNS.LOG_ERROR)
|
||||||
RNS.trace_exception(e)
|
RNS.trace_exception(e)
|
||||||
|
|
||||||
|
def incoming_call(self, remote_identity):
|
||||||
|
display_name = self.voice_display_name(remote_identity.hash)
|
||||||
|
self.setstate("voice.incoming_call", display_name)
|
||||||
|
|
||||||
rns_config = """# This template is used to generate a
|
rns_config = """# This template is used to generate a
|
||||||
# running configuration for Sideband's
|
# running configuration for Sideband's
|
||||||
# internal RNS instance. Incorrect changes
|
# internal RNS instance. Incorrect changes
|
||||||
|
|
|
@ -22,9 +22,10 @@ class ReticulumTelephone():
|
||||||
WAIT_TIME = 60
|
WAIT_TIME = 60
|
||||||
PATH_TIME = 10
|
PATH_TIME = 10
|
||||||
|
|
||||||
def __init__(self, identity, verbosity = 0, service = False):
|
def __init__(self, identity, owner = None, service = False):
|
||||||
self.identity = identity
|
self.identity = identity
|
||||||
self.service = service
|
self.service = service
|
||||||
|
self.owner = owner
|
||||||
self.config = None
|
self.config = None
|
||||||
self.should_run = False
|
self.should_run = False
|
||||||
self.telephone = None
|
self.telephone = None
|
||||||
|
@ -124,6 +125,8 @@ class ReticulumTelephone():
|
||||||
self.caller = remote_identity
|
self.caller = remote_identity
|
||||||
self.direction = "from" if self.direction == None else "to"
|
self.direction = "from" if self.direction == None else "to"
|
||||||
RNS.log(f"Incoming call from {RNS.prettyhexrep(self.caller.hash)}", RNS.LOG_DEBUG)
|
RNS.log(f"Incoming call from {RNS.prettyhexrep(self.caller.hash)}", RNS.LOG_DEBUG)
|
||||||
|
if self.owner:
|
||||||
|
self.owner.incoming_call(remote_identity)
|
||||||
|
|
||||||
def call_ended(self, remote_identity):
|
def call_ended(self, remote_identity):
|
||||||
if self.is_in_call or self.is_ringing or self.call_is_connecting:
|
if self.is_in_call or self.is_ringing or self.call_is_connecting:
|
||||||
|
|
|
@ -54,7 +54,9 @@ class Voice():
|
||||||
if self.app.root.ids.screen_manager.current == "voice_screen":
|
if self.app.root.ids.screen_manager.current == "voice_screen":
|
||||||
if self.ui_updater == None: self.ui_updater = Clock.schedule_interval(self.update_call_status, 0.5)
|
if self.ui_updater == None: self.ui_updater = Clock.schedule_interval(self.update_call_status, 0.5)
|
||||||
else:
|
else:
|
||||||
if self.ui_updater: self.ui_updater.cancel()
|
if self.ui_updater:
|
||||||
|
self.ui_updater.cancel()
|
||||||
|
self.ui_updater = None
|
||||||
|
|
||||||
db = self.screen.ids.dial_button
|
db = self.screen.ids.dial_button
|
||||||
ih = self.screen.ids.identity_hash
|
ih = self.screen.ids.identity_hash
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue