From 823ce7cb6b5f883ab1a597cdc2c77c0699e2f082 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 29 May 2020 15:11:08 +1000 Subject: [PATCH] Make Session ID in conversation settings copyable --- Signal.xcodeproj/project.pbxproj | 6 ++- .../src/Loki/Utilities/SRCopyableLabel.swift | 49 +++++++++++++++++++ .../OWSConversationSettingsViewController.m | 16 ++++-- 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 Signal/src/Loki/Utilities/SRCopyableLabel.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 4acdde737..4aba559f0 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -632,6 +632,7 @@ C3548F0824456AB6009433A8 /* UIView+Wrapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */; }; C354E75A23FE2A7600CE22E3 /* BaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C354E75923FE2A7600CE22E3 /* BaseVC.swift */; }; C36B8707243C50C60049991D /* SignalMessaging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 453518921FC63DBF00210559 /* SignalMessaging.framework */; }; + C3DAB3242480CB2B00725F25 /* SRCopyableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */; }; C3DFFAC623E96F0D0058DAF8 /* Sheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */; }; C3DFFAC823E970080058DAF8 /* OpenGroupSuggestionSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3DFFAC723E970080058DAF8 /* OpenGroupSuggestionSheet.swift */; }; CC875800737563D6891B741D /* Pods_SignalTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 748A5CAEDD7C919FC64C6807 /* Pods_SignalTests.framework */; }; @@ -1509,6 +1510,7 @@ C3548F0524456447009433A8 /* PNModeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNModeVC.swift; sourceTree = ""; }; C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Wrapping.swift"; sourceTree = ""; }; C354E75923FE2A7600CE22E3 /* BaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseVC.swift; sourceTree = ""; }; + C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SRCopyableLabel.swift; sourceTree = ""; }; C3DFFAC523E96F0D0058DAF8 /* Sheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sheet.swift; sourceTree = ""; }; C3DFFAC723E970080058DAF8 /* OpenGroupSuggestionSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupSuggestionSheet.swift; sourceTree = ""; }; D17BB5C25D615AB49813100C /* Pods_Signal.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Signal.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2896,13 +2898,14 @@ isa = PBXGroup; children = ( B8544E3223D50E4900299F14 /* AppearanceUtilities.swift */, + C31A6C5B247F2CF3001123EF /* CGRect+Utilities.swift */, B84664F4235022F30083A1CD /* MentionUtilities.swift */, B886B4A82398BA1500211ABE /* QRCode.swift */, B8783E9D23EB948D00404FB8 /* UILabel+Interaction.swift */, B83F2B87240CB75A000A54AB /* UIImage+Scaling.swift */, C31A6C59247F214E001123EF /* UIView+Glow.swift */, C3548F0724456AB6009433A8 /* UIView+Wrapping.swift */, - C31A6C5B247F2CF3001123EF /* CGRect+Utilities.swift */, + C3DAB3232480CB2A00725F25 /* SRCopyableLabel.swift */, ); path = Utilities; sourceTree = ""; @@ -4158,6 +4161,7 @@ 4C4AE6A1224AF35700D4AF6F /* SendMediaNavigationController.swift in Sources */, 34D8C0281ED3673300188D7C /* DebugUITableViewController.m in Sources */, 45F32C222057297A00A300D5 /* MediaDetailViewController.m in Sources */, + C3DAB3242480CB2B00725F25 /* SRCopyableLabel.swift in Sources */, B8B26C8F234D629C004ED98C /* MentionCandidateSelectionView.swift in Sources */, B879D44B247E1D9200DB3608 /* PathStatusView.swift in Sources */, 34B3F8851E8DF1700035BE1A /* NewGroupViewController.m in Sources */, diff --git a/Signal/src/Loki/Utilities/SRCopyableLabel.swift b/Signal/src/Loki/Utilities/SRCopyableLabel.swift new file mode 100644 index 000000000..50b71eb53 --- /dev/null +++ b/Signal/src/Loki/Utilities/SRCopyableLabel.swift @@ -0,0 +1,49 @@ +// +// SRCopyableLabel.swift +// +// Created by Stephen Radford on 08/09/2015. +// Copyright (c) 2015 Cocoon Development Ltd. All rights reserved. +// + +import UIKit + +@objc class SRCopyableLabel : UILabel { + + override public var canBecomeFirstResponder: Bool { return true } + + override init(frame: CGRect) { + super.init(frame: frame) + initialize() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + initialize() + } + + private func initialize() { + isUserInteractionEnabled = true + addGestureRecognizer(UILongPressGestureRecognizer( + target: self, + action: #selector(showMenu(sender:)) + )) + } + + override func copy(_ sender: Any?) { + UIPasteboard.general.string = text + UIMenuController.shared.setMenuVisible(false, animated: true) + } + + @objc func showMenu(sender: Any?) { + becomeFirstResponder() + let menu = UIMenuController.shared + if !menu.isMenuVisible { + menu.setTargetRect(bounds, in: self) + menu.setMenuVisible(true, animated: true) + } + } + + override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { + return (action == #selector(copy(_:))) + } +} diff --git a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m index d36ea1ecb..123e4df72 100644 --- a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m @@ -352,7 +352,13 @@ const CGFloat kIconViewLength = 24; OWSTableSection *mainSection = [OWSTableSection new]; mainSection.customHeaderView = [self mainSectionHeader]; - mainSection.customHeaderHeight = self.isGroupThread ? @(147.f) : @(208.f); + + if (self.isGroupThread) { + mainSection.customHeaderHeight = @(147.f); + } else { + BOOL isSmallScreen = (UIScreen.mainScreen.bounds.size.height - 568) < 1; + mainSection.customHeaderHeight = isSmallScreen ? @(201.f) : @(208.f); + } /** * Loki: Original code @@ -945,7 +951,9 @@ const CGFloat kIconViewLength = 24; stackView.spacing = LKValues.mediumSpacing; stackView.distribution = UIStackViewDistributionEqualCentering; stackView.alignment = UIStackViewAlignmentCenter; - stackView.layoutMargins = UIEdgeInsetsMake(LKValues.mediumSpacing, LKValues.veryLargeSpacing, LKValues.mediumSpacing, LKValues.veryLargeSpacing); + BOOL isSmallScreen = (UIScreen.mainScreen.bounds.size.height - 568) < 1; + CGFloat horizontalSpacing = isSmallScreen ? LKValues.largeSpacing : LKValues.veryLargeSpacing; + stackView.layoutMargins = UIEdgeInsetsMake(LKValues.mediumSpacing, horizontalSpacing, LKValues.mediumSpacing, horizontalSpacing); [stackView setLayoutMarginsRelativeArrangement:YES]; if (self.isGroupThread) { @@ -954,9 +962,9 @@ const CGFloat kIconViewLength = 24; } else { profilePictureView.hexEncodedPublicKey = self.thread.contactIdentifier; - UILabel *subtitleView = [UILabel new]; + SRCopyableLabel *subtitleView = [SRCopyableLabel new]; subtitleView.textColor = LKColors.text; - subtitleView.font = [LKFonts spaceMonoOfSize:LKValues.mediumFontSize]; + subtitleView.font = [LKFonts spaceMonoOfSize:LKValues.smallFontSize]; subtitleView.lineBreakMode = NSLineBreakByCharWrapping; subtitleView.numberOfLines = 2; subtitleView.text = self.thread.contactIdentifier;