calls manager fixes
This commit is contained in:
parent
e8a0a3f5be
commit
ec5bcbddec
5 changed files with 79 additions and 62 deletions
|
@ -296,7 +296,6 @@ class App:
|
||||||
self._smiley_loader = SmileyLoader(self._settings)
|
self._smiley_loader = SmileyLoader(self._settings)
|
||||||
self._tox_dns = ToxDns(self._settings)
|
self._tox_dns = ToxDns(self._settings)
|
||||||
self._ms = MainWindow(self._settings, self._tray)
|
self._ms = MainWindow(self._settings, self._tray)
|
||||||
self._calls_manager = CallsManager(self._tox.AV, self._settings)
|
|
||||||
db = Database(self._path.replace('.tox', '.db'), self._toxes)
|
db = Database(self._path.replace('.tox', '.db'), self._toxes)
|
||||||
|
|
||||||
friend_items_factory = FriendItemsFactory(self._settings, self._ms)
|
friend_items_factory = FriendItemsFactory(self._settings, self._ms)
|
||||||
|
@ -312,8 +311,9 @@ class App:
|
||||||
self._contacts_provider, history, self._tox_dns,
|
self._contacts_provider, history, self._tox_dns,
|
||||||
messages_items_factory)
|
messages_items_factory)
|
||||||
history.set_contacts_manager(self._contacts_manager)
|
history.set_contacts_manager(self._contacts_manager)
|
||||||
|
self._calls_manager = CallsManager(self._tox.AV, self._settings, self._ms, self._contacts_manager)
|
||||||
self._messenger = Messenger(self._tox, self._plugin_loader, self._ms, self._contacts_manager,
|
self._messenger = Messenger(self._tox, self._plugin_loader, self._ms, self._contacts_manager,
|
||||||
self._contacts_provider, messages_items_factory, profile)
|
self._contacts_provider, messages_items_factory, profile, self._calls_manager)
|
||||||
file_transfers_message_service = FileTransfersMessagesService(self._contacts_manager, messages_items_factory,
|
file_transfers_message_service = FileTransfersMessagesService(self._contacts_manager, messages_items_factory,
|
||||||
profile, self._ms)
|
profile, self._ms)
|
||||||
self._file_transfer_handler = FileTransfersHandler(self._tox, self._settings, self._contacts_provider,
|
self._file_transfer_handler = FileTransfersHandler(self._tox, self._settings, self._contacts_provider,
|
||||||
|
|
|
@ -1,19 +1,37 @@
|
||||||
import threading
|
import threading
|
||||||
import cv2
|
import cv2
|
||||||
import av.calls
|
import av.calls
|
||||||
import utils.ui as util_ui
|
|
||||||
from messenger.messages import *
|
from messenger.messages import *
|
||||||
import time
|
import time
|
||||||
from ui import av_widgets
|
from ui import av_widgets
|
||||||
|
import common.event as event
|
||||||
|
|
||||||
|
|
||||||
class CallsManager:
|
class CallsManager:
|
||||||
|
|
||||||
def __init__(self, toxAV, settings):
|
def __init__(self, toxAV, settings, screen, contacts_manager):
|
||||||
self._call = av.calls.AV(toxAV, settings) # object with data about calls
|
self._call = av.calls.AV(toxAV, settings) # object with data about calls
|
||||||
self._call_widgets = {} # dict of incoming call widgets
|
self._call_widgets = {} # dict of incoming call widgets
|
||||||
self._incoming_calls = set()
|
self._incoming_calls = set()
|
||||||
self._settings = settings
|
self._settings = settings
|
||||||
|
self._screen = screen
|
||||||
|
self._contacts_manager = contacts_manager
|
||||||
|
self._call_started_event = event.Event() # friend_number, audio, video, is_outgoing
|
||||||
|
self._call_finished_event = event.Event() # friend_number, is_declined
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
# Events
|
||||||
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def get_call_started_event(self):
|
||||||
|
return self._call_started_event
|
||||||
|
|
||||||
|
call_started_event = property(get_call_started_event)
|
||||||
|
|
||||||
|
def get_call_finished_event(self):
|
||||||
|
return self._call_finished_event
|
||||||
|
|
||||||
|
call_finished_event = property(get_call_finished_event)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# AV support
|
# AV support
|
||||||
|
@ -26,21 +44,17 @@ class CallsManager:
|
||||||
|
|
||||||
def call_click(self, audio=True, video=False):
|
def call_click(self, audio=True, video=False):
|
||||||
"""User clicked audio button in main window"""
|
"""User clicked audio button in main window"""
|
||||||
num = self.get_active_number()
|
num = self._contacts_manager.get_active_number()
|
||||||
if not self.is_active_a_friend():
|
if not self._contacts_manager.is_active_a_friend():
|
||||||
return
|
return
|
||||||
if num not in self._call and self.is_active_online(): # start call
|
if num not in self._call and self._contacts_manager.is_active_online(): # start call
|
||||||
if not self._settings.audio['enabled']:
|
if not self._settings.audio['enabled']:
|
||||||
return
|
return
|
||||||
self._call(num, audio, video)
|
self._call(num, audio, video)
|
||||||
self._screen.active_call()
|
self._screen.active_call()
|
||||||
if video:
|
self._call_started_event(num, audio, video, True)
|
||||||
text = util_ui.tr("Outgoing video call")
|
self._contacts_manager.get_curr_friend().append_message(InfoMessage(text, time.time()))
|
||||||
else:
|
self._screen.messages.scrollToBottom()
|
||||||
text = util_ui.tr("Outgoing audio call")
|
|
||||||
self.get_curr_friend().append_message(InfoMessage(text, time.time()))
|
|
||||||
self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
|
|
||||||
self._messages.scrollToBottom()
|
|
||||||
elif num in self._call: # finish or cancel call if you call with active friend
|
elif num in self._call: # finish or cancel call if you call with active friend
|
||||||
self.stop_call(num, False)
|
self.stop_call(num, False)
|
||||||
|
|
||||||
|
@ -50,17 +64,12 @@ class CallsManager:
|
||||||
"""
|
"""
|
||||||
if not self._settings.audio['enabled']:
|
if not self._settings.audio['enabled']:
|
||||||
return
|
return
|
||||||
friend = self.get_friend_by_number(friend_number)
|
friend = self._contacts_manager.get_friend_by_number(friend_number)
|
||||||
if video:
|
self._call_started_event(friend_number, audio, video, False)
|
||||||
text = util_ui.tr("Incoming video call")
|
|
||||||
else:
|
|
||||||
text = util_ui.tr("Incoming audio call")
|
|
||||||
friend.append_message(InfoMessage(text, time.time()))
|
friend.append_message(InfoMessage(text, time.time()))
|
||||||
self._incoming_calls.add(friend_number)
|
self._incoming_calls.add(friend_number)
|
||||||
if friend_number == self.get_active_number():
|
if friend_number == self._contacts_manager.get_active_number():
|
||||||
self._screen.incoming_call()
|
self._screen.incoming_call()
|
||||||
self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
|
|
||||||
self._messages.scrollToBottom()
|
|
||||||
else:
|
else:
|
||||||
friend.actions = True
|
friend.actions = True
|
||||||
self._call_widgets[friend_number] = av_widgets.IncomingCallWidget(friend_number, text, friend.name)
|
self._call_widgets[friend_number] = av_widgets.IncomingCallWidget(friend_number, text, friend.name)
|
||||||
|
@ -83,8 +92,10 @@ class CallsManager:
|
||||||
"""
|
"""
|
||||||
if friend_number in self._incoming_calls:
|
if friend_number in self._incoming_calls:
|
||||||
self._incoming_calls.remove(friend_number)
|
self._incoming_calls.remove(friend_number)
|
||||||
|
is_declined = True
|
||||||
text = util_ui.tr("Call declined")
|
text = util_ui.tr("Call declined")
|
||||||
else:
|
else:
|
||||||
|
is_declined = False
|
||||||
text = util_ui.tr("Call finished")
|
text = util_ui.tr("Call finished")
|
||||||
self._screen.call_finished()
|
self._screen.call_finished()
|
||||||
is_video = self._call.is_video_call(friend_number)
|
is_video = self._call.is_video_call(friend_number)
|
||||||
|
@ -98,11 +109,7 @@ class CallsManager:
|
||||||
cv2.destroyWindow(str(friend_number))
|
cv2.destroyWindow(str(friend_number))
|
||||||
|
|
||||||
threading.Timer(2.0, destroy_window).start()
|
threading.Timer(2.0, destroy_window).start()
|
||||||
friend = self.get_friend_by_number(friend_number)
|
self._call_finished_event(friend_number, is_declined)
|
||||||
friend.append_message(InfoMessage(text, time.time()))
|
|
||||||
if friend_number == self.get_active_number():
|
|
||||||
self.create_message_item(text, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
|
|
||||||
self._messages.scrollToBottom()
|
|
||||||
|
|
||||||
def friend_exit(self, friend_number):
|
def friend_exit(self, friend_number):
|
||||||
if friend_number in self._call:
|
if friend_number in self._call:
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
from contacts.friend import *
|
|
||||||
from file_transfers.file_transfers import *
|
|
||||||
import time
|
|
||||||
from contacts import basecontact
|
from contacts import basecontact
|
||||||
import utils.ui as util_ui
|
|
||||||
import random
|
import random
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
@ -28,7 +24,7 @@ class Profile(basecontact.BaseContact):
|
||||||
self._contacts_provider = contacts_provider
|
self._contacts_provider = contacts_provider
|
||||||
self._reset_action = reset_action
|
self._reset_action = reset_action
|
||||||
self._waiting_for_reconnection = False
|
self._waiting_for_reconnection = False
|
||||||
self._timer = threading.Timer(50, self._reconnect)
|
self._timer = None
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Edit current user's data
|
# Edit current user's data
|
||||||
|
@ -47,21 +43,14 @@ class Profile(basecontact.BaseContact):
|
||||||
self._tox.self_set_status(status)
|
self._tox.self_set_status(status)
|
||||||
elif not self._waiting_for_reconnection:
|
elif not self._waiting_for_reconnection:
|
||||||
self._waiting_for_reconnection = True
|
self._waiting_for_reconnection = True
|
||||||
|
self._timer = threading.Timer(50, self._reconnect)
|
||||||
self._timer.start()
|
self._timer.start()
|
||||||
|
|
||||||
def set_name(self, value):
|
def set_name(self, value):
|
||||||
if self.name == value:
|
if self.name == value:
|
||||||
return
|
return
|
||||||
tmp = self.name
|
|
||||||
super().set_name(value.encode('utf-8'))
|
super().set_name(value.encode('utf-8'))
|
||||||
self._tox.self_set_name(self._name.encode('utf-8'))
|
self._tox.self_set_name(self._name.encode('utf-8'))
|
||||||
message = util_ui.tr('User {} is now known as {}')
|
|
||||||
message = message.format(tmp, value)
|
|
||||||
for friend in self._contacts:
|
|
||||||
friend.append_message(InfoMessage(message, time.time()))
|
|
||||||
if self._active_friend + 1:
|
|
||||||
self.create_message_item(message, time.time(), '', MESSAGE_TYPE['INFO_MESSAGE'])
|
|
||||||
self._messages.scrollToBottom()
|
|
||||||
|
|
||||||
def set_status_message(self, value):
|
def set_status_message(self, value):
|
||||||
super().set_status_message(value)
|
super().set_status_message(value)
|
||||||
|
@ -74,15 +63,6 @@ class Profile(basecontact.BaseContact):
|
||||||
|
|
||||||
return self._tox_id
|
return self._tox_id
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
|
||||||
# Private messages
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def receipt(self):
|
|
||||||
i = 0
|
|
||||||
while i < self._messages.count() and not self._messages.itemWidget(self._messages.item(i)).mark_as_sent():
|
|
||||||
i += 1
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Reset
|
# Reset
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
@ -101,10 +81,5 @@ class Profile(basecontact.BaseContact):
|
||||||
if self.status is None or all(list(map(lambda x: x.status is None, contacts))) and len(contacts):
|
if self.status is None or all(list(map(lambda x: x.status is None, contacts))) and len(contacts):
|
||||||
self._waiting_for_reconnection = True
|
self._waiting_for_reconnection = True
|
||||||
self._restart()
|
self._restart()
|
||||||
|
self._timer = threading.Timer(50, self._reconnect)
|
||||||
self._timer.start()
|
self._timer.start()
|
||||||
|
|
||||||
def close(self):
|
|
||||||
for friend in filter(lambda x: type(x) is Friend, self._contacts):
|
|
||||||
self.friend_exit(friend.number)
|
|
||||||
for i in range(len(self._contacts)):
|
|
||||||
del self._contacts[0]
|
|
||||||
|
|
|
@ -216,5 +216,5 @@ class InlineImageMessage(Message):
|
||||||
|
|
||||||
class InfoMessage(TextMessage):
|
class InfoMessage(TextMessage):
|
||||||
|
|
||||||
def __init__(self, id, message, time):
|
def __init__(self, message, time):
|
||||||
super().__init__(id, message, None, time, MESSAGE_TYPE['INFO_MESSAGE'])
|
super().__init__(message, None, time, MESSAGE_TYPE['INFO_MESSAGE'])
|
||||||
|
|
|
@ -1,14 +1,11 @@
|
||||||
import utils.util as util
|
|
||||||
import common.tox_save as tox_save
|
import common.tox_save as tox_save
|
||||||
from wrapper.toxcore_enums_and_consts import *
|
|
||||||
from messenger.messages import *
|
from messenger.messages import *
|
||||||
|
|
||||||
|
|
||||||
# TODO: sub profile name changed event?
|
|
||||||
|
|
||||||
class Messenger(tox_save.ToxSave):
|
class Messenger(tox_save.ToxSave):
|
||||||
|
|
||||||
def __init__(self, tox, plugin_loader, screen, contacts_manager, contacts_provider, items_factory, profile):
|
def __init__(self, tox, plugin_loader, screen, contacts_manager, contacts_provider, items_factory, profile,
|
||||||
|
calls_manager):
|
||||||
super().__init__(tox)
|
super().__init__(tox)
|
||||||
self._plugin_loader = plugin_loader
|
self._plugin_loader = plugin_loader
|
||||||
self._screen = screen
|
self._screen = screen
|
||||||
|
@ -16,6 +13,11 @@ class Messenger(tox_save.ToxSave):
|
||||||
self._contacts_provider = contacts_provider
|
self._contacts_provider = contacts_provider
|
||||||
self._items_factory = items_factory
|
self._items_factory = items_factory
|
||||||
self._profile = profile
|
self._profile = profile
|
||||||
|
self._profile_name = profile.name
|
||||||
|
|
||||||
|
profile.name_changed_event.add_callback(self._on_profile_name_changed)
|
||||||
|
calls_manager.call_started_event.add_callback(self._on_call_started)
|
||||||
|
calls_manager.call_finished_event.add_callback(self._on_call_finished)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
# Private methods
|
# Private methods
|
||||||
|
@ -160,3 +162,36 @@ class Messenger(tox_save.ToxSave):
|
||||||
|
|
||||||
def _get_friend_by_number(self, friend_number):
|
def _get_friend_by_number(self, friend_number):
|
||||||
return self._contacts_provider.get_friend_by_number(friend_number)
|
return self._contacts_provider.get_friend_by_number(friend_number)
|
||||||
|
|
||||||
|
def _on_profile_name_changed(self, new_name):
|
||||||
|
if self._profile_name == new_name:
|
||||||
|
return
|
||||||
|
message = util_ui.tr('User {} is now known as {}')
|
||||||
|
message = message.format(self._profile_name, new_name)
|
||||||
|
for friend in self._contacts_provider.get_all_friends():
|
||||||
|
friend.append_message(InfoMessage(message, util.get_unix_time()))
|
||||||
|
if self._contacts_manager.is_active_a_friend():
|
||||||
|
self._items_factory.create_message_item(message)
|
||||||
|
self._screen.messages.scrollToBottom()
|
||||||
|
self._profile_name = new_name
|
||||||
|
|
||||||
|
def _on_call_started(self, friend_number, audio, video, is_outgoing):
|
||||||
|
if is_outgoing:
|
||||||
|
text = util_ui.tr("Outgoing video call") if video else util_ui.tr("Outgoing audio call")
|
||||||
|
else:
|
||||||
|
text = util_ui.tr("Incoming video call") if video else util_ui.tr("Incoming audio call")
|
||||||
|
friend = self._get_friend_by_number(friend_number)
|
||||||
|
message = InfoMessage(text, util.get_unix_time())
|
||||||
|
friend.append_message(message)
|
||||||
|
if self._contacts_manager.is_friend_active(friend_number):
|
||||||
|
self._items_factory.create_message_item(message)
|
||||||
|
self._screen.messages.scrollToBottom()
|
||||||
|
|
||||||
|
def _on_call_finished(self, friend_number, is_declined):
|
||||||
|
text = util_ui.tr("Call declined") if is_declined else util_ui.tr("Call finished")
|
||||||
|
friend = self._get_friend_by_number(friend_number)
|
||||||
|
message = InfoMessage(text, util.get_unix_time())
|
||||||
|
friend.append_message(message)
|
||||||
|
if self._contacts_manager.is_friend_active(friend_number):
|
||||||
|
self._items_factory.create_message_item(message)
|
||||||
|
self._screen.messages.scrollToBottom()
|
||||||
|
|
Loading…
Reference in a new issue