From b54cd3b02644aa3a5e937ff4e2a36baf3ffe528c Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 16 Aug 2021 16:24:49 +1000 Subject: [PATCH] Add call button to conversation screen --- Session/Calls/CallVCV2.swift | 2 +- .../ConversationVC+Interaction.swift | 5 +++++ Session/Conversations/ConversationVC.swift | 18 ++++++++++++------ .../ConversationTitleView.swift | 3 ++- Session/Home/HomeVC.swift | 6 +----- .../Session/Phone.imageset/Contents.json | 12 ++++++++++++ .../Session/Phone.imageset/Phone.pdf | Bin 0 -> 42151 bytes 7 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 Session/Meta/Images.xcassets/Session/Phone.imageset/Contents.json create mode 100644 Session/Meta/Images.xcassets/Session/Phone.imageset/Phone.pdf diff --git a/Session/Calls/CallVCV2.swift b/Session/Calls/CallVCV2.swift index beaed8d24..b73538064 100644 --- a/Session/Calls/CallVCV2.swift +++ b/Session/Calls/CallVCV2.swift @@ -1,7 +1,7 @@ import WebRTC final class CallVCV2 : UIViewController { - let roomID = "37923672514" // NOTE: You need to change this every time to ensure the room isn't full + let roomID = "37923672515" // NOTE: You need to change this every time to ensure the room isn't full var room: RoomInfo? var socket: WebSocket? diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 2a1bf39bc..1fba6eab4 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -25,6 +25,11 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc unreadViewItems.removeAll() messagesTableView.scrollToRow(at: indexPath, at: .top, animated: true) } + + @objc func startCall() { + let callVC = CallVCV2() + navigationController!.pushViewController(callVC, animated: true, completion: nil) + } // MARK: Blocking @objc func unblock() { diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index bee500a68..ae4ccfdf5 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -294,7 +294,7 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat if isShowingSearchUI { navigationItem.rightBarButtonItems = [] } else { - let rightBarButtonItem: UIBarButtonItem + var rightBarButtonItems: [UIBarButtonItem] = [] if thread is TSContactThread { let size = Values.verySmallProfilePictureSize let profilePictureView = ProfilePictureView() @@ -305,13 +305,19 @@ final class ConversationVC : BaseVC, ConversationViewModelDelegate, OWSConversat profilePictureView.set(.height, to: size) let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(openSettings)) profilePictureView.addGestureRecognizer(tapGestureRecognizer) - rightBarButtonItem = UIBarButtonItem(customView: profilePictureView) + let settingsButton = UIBarButtonItem(customView: profilePictureView) + settingsButton.accessibilityLabel = "Settings button" + settingsButton.isAccessibilityElement = true + rightBarButtonItems.append(settingsButton) + let callButton = UIBarButtonItem(image: UIImage(named: "Phone")!, style: .plain, target: self, action: #selector(startCall)) + rightBarButtonItems.append(callButton) } else { - rightBarButtonItem = UIBarButtonItem(image: UIImage(named: "Gear"), style: .plain, target: self, action: #selector(openSettings)) + let settingsButton = UIBarButtonItem(image: UIImage(named: "Gear"), style: .plain, target: self, action: #selector(openSettings)) + settingsButton.accessibilityLabel = "Settings button" + settingsButton.isAccessibilityElement = true + rightBarButtonItems.append(settingsButton) } - rightBarButtonItem.accessibilityLabel = "Settings button" - rightBarButtonItem.isAccessibilityElement = true - navigationItem.rightBarButtonItem = rightBarButtonItem + navigationItem.rightBarButtonItems = rightBarButtonItems } } diff --git a/Session/Conversations/Views & Modals/ConversationTitleView.swift b/Session/Conversations/Views & Modals/ConversationTitleView.swift index d80912b29..0d744f16c 100644 --- a/Session/Conversations/Views & Modals/ConversationTitleView.swift +++ b/Session/Conversations/Views & Modals/ConversationTitleView.swift @@ -44,7 +44,8 @@ final class ConversationTitleView : UIView { stackView.axis = .vertical stackView.alignment = .center stackView.isLayoutMarginsRelativeArrangement = true - stackView.layoutMargins = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 0) + let leftMargin: CGFloat = (thread is TSContactThread) ? 54 : 8 // Contact threads also have the call button to compensate for + stackView.layoutMargins = UIEdgeInsets(top: 0, left: leftMargin, bottom: 0, right: 0) addSubview(stackView) stackView.pin(to: self) let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap)) diff --git a/Session/Home/HomeVC.swift b/Session/Home/HomeVC.swift index dcd501085..66b1696f3 100644 --- a/Session/Home/HomeVC.swift +++ b/Session/Home/HomeVC.swift @@ -156,11 +156,7 @@ final class HomeVC : BaseVC, UITableViewDataSource, UITableViewDelegate, NewConv let _ = IP2Country.shared.populateCacheIfNeeded() } // Get default open group rooms if needed - OpenGroupAPIV2.getDefaultRoomsIfNeeded() - - let callVC = CallVCV2() - present(callVC, animated: true, completion: nil) - + OpenGroupAPIV2.getDefaultRoomsIfNeeded() } override func viewDidAppear(_ animated: Bool) { diff --git a/Session/Meta/Images.xcassets/Session/Phone.imageset/Contents.json b/Session/Meta/Images.xcassets/Session/Phone.imageset/Contents.json new file mode 100644 index 000000000..dfb33732e --- /dev/null +++ b/Session/Meta/Images.xcassets/Session/Phone.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "Phone.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Session/Meta/Images.xcassets/Session/Phone.imageset/Phone.pdf b/Session/Meta/Images.xcassets/Session/Phone.imageset/Phone.pdf new file mode 100644 index 0000000000000000000000000000000000000000..460eadf490ec83a37c89108dcb2d38aca1bf57c8 GIT binary patch literal 42151 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