Daniel Brötzmann pushed to branch mainwindow at gajim / gajim
Commits: af52f23f by wurstsalat at 2021-10-31T22:38:40+01:00 Calls: Store and load events from DB
- - - - -
8 changed files:
- gajim/common/const.py - gajim/common/jingle_session.py - gajim/gtk/call_widget.py - gajim/gtk/chat_list.py - gajim/gtk/controls/base.py - gajim/gtk/controls/chat.py - gajim/gtk/conversation/rows/call.py - gajim/gtk/conversation/view.py
Changes:
===================================== gajim/common/const.py ===================================== @@ -70,6 +70,7 @@ class KindConstant(IntEnum): CHAT_MSG_SENT = 6 ERROR = 7 FILE_TRANSFER = 8 + CALL = 9
def __str__(self): return str(self.value)
===================================== gajim/common/jingle_session.py ===================================== @@ -27,14 +27,18 @@ # - Tie-breaking # * timeout
+import time import logging from enum import Enum, unique
import nbxmpp +from nbxmpp import JID from nbxmpp.namespaces import Namespace from nbxmpp.util import generate_id
from gajim.common import app +from gajim.common.const import KindConstant +from gajim.common.helpers import AdditionalDataDict from gajim.common.jingle_transport import get_jingle_transport from gajim.common.jingle_transport import JingleTransportIBB from gajim.common.jingle_content import get_jingle_content @@ -581,6 +585,25 @@ def __on_session_initiate(self, stanza, jingle, error, action): # Send event about starting a session self._raise_event('jingle-request-received', contents=contents)
+ # Check if it's an A/V call and add it to the archive + content_types = [] + for item in contents: + content_types.append(item.media) + if not any(item in ('audio', 'video') for item in content_types): + return + + account = self.connection.name + jid = JID.from_string(self.peerjid) + timestamp = time.time() + additional_data = AdditionalDataDict() + additional_data.set_value('gajim', 'sid', self.sid) + app.storage.archive.insert_into_logs( + account, + jid.bare, + timestamp, + KindConstant.CALL, + additional_data=additional_data) + def __broadcast(self, stanza, jingle, error, action): """ Broadcast the stanza contents to proper content handlers
===================================== gajim/gtk/call_widget.py ===================================== @@ -271,9 +271,7 @@ def start_call(self): self._jingle['video'].available) self._ui.av_cam_button.set_sensitive(False)
- def accept_call(self, event): - session = self._client.get_module('Jingle').get_jingle_session( - event.fjid, event.sid) + def accept_call(self, session): if not session: return
@@ -282,28 +280,33 @@ def accept_call(self, event):
if audio and not audio.negotiated: self._set_jingle_state( - 'audio', JingleState.CONNECTING, event.sid) + 'audio', JingleState.CONNECTING, session.sid) if video and not video.negotiated: self._set_jingle_state( - 'video', JingleState.CONNECTING, event.sid) + 'video', JingleState.CONNECTING, session.sid)
if not session.accepted: session.approve_session()
- for item in event.contents: - session.approve_content(item.media) + if audio is not None: + session.approve_content('audio') + if video is not None: + session.approve_content('video')
- def reject_call(self, event): - session = self._client.get_module('Jingle').get_jingle_session( - event.fjid, event.sid) + def reject_call(self, session): if not session: return
+ audio = session.get_content('audio') + video = session.get_content('video') + if not session.accepted: session.decline_session() else: - for item in event.contents: - session.reject_content(item.media) + if audio is not None: + session.reject_content('audio') + if video is not None: + session.reject_content('video')
def _update_audio(self): audio_state = self._jingle['audio'].state
===================================== gajim/gtk/chat_list.py ===================================== @@ -470,6 +470,12 @@ def __init__(self, workspace_id, account, jid, type_, pinned): uf_timestamp = get_uf_relative_time(line.time) self._ui.timestamp_label.set_text(uf_timestamp)
+ if line.kind == KindConstant.CALL: + self._ui.message_label.set_text(_('Call')) + self.timestamp = line.time + uf_timestamp = get_uf_relative_time(line.time) + self._ui.timestamp_label.set_text(uf_timestamp) + self.show_all()
@property
===================================== gajim/gtk/controls/base.py ===================================== @@ -1091,8 +1091,10 @@ def add_jingle_file_transfer(self, event): if self._scrolled_view.get_lower_complete() and control_selected: self.conversation_view.add_jingle_file_transfer(event)
- def add_call_message(self, timestamp, text, event=None): - self.conversation_view.add_call_message(timestamp, text, event) + def add_call_message(self, event): + control_selected = bool(self == app.window.get_active_control()) + if self._scrolled_view.get_lower_complete() and control_selected: + self.conversation_view.add_call_message(event=event)
def add_message(self, text, @@ -1364,6 +1366,10 @@ def add_messages(self, messages): db_message=msg) continue
+ if msg.kind == KindConstant.CALL: + self.conversation_view.add_call_message(db_message=msg) + continue + if not msg.message: continue
===================================== gajim/gtk/controls/chat.py ===================================== @@ -488,17 +488,17 @@ def _on_start_call(self): def _process_jingle_av_event(self, event): self._call_widget.process_event(event)
- def _on_accept_call(self, _view, event): - self._call_widget.accept_call(event) + def _on_accept_call(self, _view, session): + self._call_widget.accept_call(session)
- def _on_reject_call(self, _view, event): - self._call_widget.reject_call(event) + def _on_reject_call(self, _view, session): + self._call_widget.reject_call(session)
def _on_call_ended(self, _call_widget): self.conversation_view.update_call_rows()
def _add_incoming_call(self, _call_widget, event): - self.add_call_message(time.time(), '', event=event) + self.add_call_message(event)
def on_location_eventbox_button_release_event(self, _widget, _event): return
===================================== gajim/gtk/conversation/rows/call.py ===================================== @@ -17,6 +17,7 @@
from gi.repository import Gtk
+from gajim.common import app from gajim.common.const import AvatarSize from gajim.common.i18n import _
@@ -25,29 +26,43 @@
class CallRow(BaseRow): - def __init__(self, account, contact, timestamp, text, event=None): + def __init__(self, account, contact, event=None, db_message=None): BaseRow.__init__(self, account)
self.type = 'call' - timestamp = time.time() + + self._client = app.get_client(account) + + is_from_db = bool(db_message is not None) + + if is_from_db: + timestamp = db_message.time + else: + timestamp = time.time() self.timestamp = datetime.fromtimestamp(timestamp) self.db_timestamp = timestamp
self._contact = contact self._event = event + self._session = None + + if is_from_db: + sid = db_message.additional_data.get_value('gajim', 'sid') + self._session = self._client.get_module('Jingle').get_jingle_session( + self._contact.jid, sid)
avatar_placeholder = Gtk.Box() avatar_placeholder.set_size_request(AvatarSize.ROSTER, -1) self.grid.attach(avatar_placeholder, 0, 0, 1, 1)
- if event is None: + if event is None and self._session is None: icon = Gtk.Image.new_from_icon_name('call-start-symbolic', Gtk.IconSize.MENU) self.grid.attach(icon, 1, 0, 1, 1)
label = SimpleLabel() label.get_style_context().add_class('dim-label') - label.set_text(text) + label.set_text(_('Call')) self.grid.attach(label, 2, 0, 1, 1) else: self._prepare_incoming_call() @@ -81,12 +96,22 @@ def update(self): def _on_accept(self, button): button.set_sensitive(False) self._reject_button.set_sensitive(False) - self.get_parent().accept_call(self._event) + if self._event is not None: + session = self._client.get_module('Jingle').get_jingle_session( + self._event.fjid, self._event.sid) + self.get_parent().accept_call(session) + else: + self.get_parent().accept_call(self._session)
def _on_reject(self, button): button.set_sensitive(False) self._accept_button.set_sensitive(False) - self.get_parent().reject_call(self._event) + if self._event is not None: + session = self._client.get_module('Jingle').get_jingle_session( + self._event.fjid, self._event.sid) + self.get_parent().reject_call(session) + else: + self.get_parent().reject_call(self._session)
def _prepare_incoming_call(self): self._call_box = Gtk.Box( @@ -104,8 +129,15 @@ def _prepare_incoming_call(self): self._call_box.add(avatar_image)
content_types = [] - for item in self._event.contents: - content_types.append(item.media) + if self._event is not None: + for item in self._event.contents: + content_types.append(item.media) + if self._session is not None: + if self._session.get_content('audio') is not None: + content_types.append('audio') + if self._session.get_content('video') is not None: + content_types.append('video') + text = _('%s is calling') % self._contact.name if 'video' in content_types: text += _(' (Video Call)') @@ -118,6 +150,7 @@ def _prepare_incoming_call(self): self._call_box.add(label)
self._accept_button = Gtk.Button.new_with_label(_('Accept Call')) + self._accept_button.get_style_context().add_class('suggested-action') self._accept_button.connect('clicked', self._on_accept)
self._reject_button = Gtk.Button.new_with_label(_('Reject')) @@ -125,8 +158,8 @@ def _prepare_incoming_call(self):
button_box = Gtk.Box(spacing=12) button_box.set_halign(Gtk.Align.CENTER) - button_box.add(self._accept_button) button_box.add(self._reject_button) + button_box.add(self._accept_button) self._call_box.add(button_box)
self.grid.attach(self._call_box, 1, 0, 1, 1)
===================================== gajim/gtk/conversation/view.py ===================================== @@ -193,12 +193,9 @@ def add_jingle_file_transfer(self, event=None, db_message=None): self._account, self._contact, event=event, db_message=db_message) self._insert_message(jingle_transfer_row)
- def add_call_message(self, timestamp, text, event): - call_row = CallRow(self._account, - self._contact, - timestamp, - text, - event) + def add_call_message(self, event=None, db_message=None): + call_row = CallRow( + self._account, self._contact, event=event, db_message=db_message) self._insert_message(call_row)
def add_command_output(self, text, is_error):
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/af52f23fa1198aabbaf1221f322ddb313...