From 53a231a3bdb87866aef9f5564ed2b35679d4c21c Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 13 Dec 2019 15:02:05 +1100 Subject: [PATCH] Finish up first version of redesign --- Signal.xcodeproj/project.pbxproj | 4 +- .../CirclePause.imageset/CirclePause.pdf | Bin 0 -> 25115 bytes .../CirclePause.imageset/Contents.json | 12 +++ .../Loki V2/Key.imageset/Contents.json | 12 +++ .../Loki V2/Key.imageset/Key.pdf | Bin 0 -> 1755 bytes .../Redesign/Components/FakeChatView.swift | 28 ++++--- .../Components}/FriendRequestView.swift | 76 +++++++++++------- .../FriendRequestViewDelegate.swift | 0 .../Loki/Redesign/Style Guide/Values.swift | 2 +- .../View Controllers/DisplayNameVC.swift | 4 +- .../View Controllers/LinkDeviceVC.swift | 4 +- .../View Controllers/RegisterVC.swift | 8 +- .../Redesign/View Controllers/RestoreVC.swift | 2 +- .../Redesign/View Controllers/SeedVCV2.swift | 4 +- Signal/src/Models/MessageActions.swift | 2 +- .../Cells/OWSAudioMessageView.m | 22 ++--- .../ConversationViewController.m | 2 +- .../GifPicker/GifPickerViewController.swift | 20 ++--- .../MediaDetailViewController.m | 4 +- .../MediaTileViewController.swift | 21 ++++- .../MenuActionsViewController.swift | 20 ++--- .../MessageDetailViewController.swift | 20 ++++- .../Photos/ImagePickerController.swift | 29 ++++--- .../PhotoCollectionPickerController.swift | 4 +- .../OWSConversationSettingsViewController.m | 6 +- Signal/src/views/PhotoGridViewCell.swift | 4 +- .../translations/en.lproj/Localizable.strings | 34 ++++---- 27 files changed, 216 insertions(+), 128 deletions(-) create mode 100644 Signal/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf create mode 100644 Signal/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json create mode 100644 Signal/Images.xcassets/Loki V2/Key.imageset/Contents.json create mode 100644 Signal/Images.xcassets/Loki V2/Key.imageset/Key.pdf rename Signal/src/Loki/{Messaging => Redesign/Components}/FriendRequestView.swift (64%) rename Signal/src/Loki/{Messaging => Redesign/Components}/FriendRequestViewDelegate.swift (100%) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index a3f9efc5a..6407866c4 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -2743,8 +2743,6 @@ B8BFFF392355426100102A27 /* Messaging */ = { isa = PBXGroup; children = ( - B8162F0222891AD600D46544 /* FriendRequestView.swift */, - B8162F0422892C5F00D46544 /* FriendRequestViewDelegate.swift */, 24A830A12293CD0100F4CAC0 /* LokiP2PServer.swift */, B825849F2315024B001B41CB /* LokiRSSFeedPoller.swift */, ); @@ -2769,6 +2767,8 @@ B8BB82AA238F669C00BA5194 /* ConversationCell.swift */, B82B4093239DF15900A248E7 /* ConversationTitleView.swift */, B82B40892399EC0600A248E7 /* FakeChatView.swift */, + B8162F0222891AD600D46544 /* FriendRequestView.swift */, + B8162F0422892C5F00D46544 /* FriendRequestViewDelegate.swift */, B8B26C8E234D629C004ED98C /* MentionCandidateSelectionView.swift */, B8B26C90234D8CBD004ED98C /* MentionCandidateSelectionViewDelegate.swift */, B8BB82AC238F734800BA5194 /* ProfilePictureView.swift */, diff --git a/Signal/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf b/Signal/Images.xcassets/Loki V2/CirclePause.imageset/CirclePause.pdf new file mode 100644 index 0000000000000000000000000000000000000000..09e535bcc473be748812b6cc63a906e1827e2483 GIT binary patch literal 25115 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 Jh{GlD{vYtiPD}s* literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json b/Signal/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json new file mode 100644 index 000000000..3a1129ed4 --- /dev/null +++ b/Signal/Images.xcassets/Loki V2/CirclePause.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "CirclePause.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/Loki V2/Key.imageset/Contents.json b/Signal/Images.xcassets/Loki V2/Key.imageset/Contents.json new file mode 100644 index 000000000..41b23419c --- /dev/null +++ b/Signal/Images.xcassets/Loki V2/Key.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Key.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/Loki V2/Key.imageset/Key.pdf b/Signal/Images.xcassets/Loki V2/Key.imageset/Key.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2e3b4133d4f2b33b5728ce4f49b01e001c3456e4 GIT binary patch literal 1755 zcmZWq3pi9+9N)J6QbVhvkVnTXLYbL6V}@x*!XSn))OswrX6`T=Gvm%3QL=@smi63< zl=Se*d_~)9V_AxJL%Ug_FB|e9ZBL~KwY&F@N7~MJ?>YDU&N=_*`TeiCFW1cmqS%tm z&p$dnNwNhrAd845aX5hLg-9c@D8R%aJ_!IobrVZ41jR=Qj3Hb^AQK{__3KFr3`O7= zQvBhV%|X(?Xj*T(t*||3$(7^!4$jYZpIp`MerIz2k(&{PG?og81b)h<7yv(YX{ zwYOrkEAPnaozSJVO+|v-E$BH&_{+mc%)ns>U%c-4JYmV&Xyn)@fu)zP#5G8RJmY#y zGQ*?4_tv5m99nti+&PK|C&?3!y1=hxrCT~yp)Ts*B$389cHK&yNTUvGUswq>sbwCC_l-i3I73G>Oh4-Mj+E@I1l3D3E%KFK zqcUcNEhTX6E9u zN@kxIuU@~csPNgO0-WT(|Vg zau^SW`ipP;n>POEn_Zd<|VWd}lA|AV3wsc#rcMU%-3(nU+JJl>?{&333Ebec?z1m;*>H*B3?+DTW`NDHq;|Pz*cE z;z0-w(E!8VR{e&mce}`>7`|Nrh>9~+UffZcQa;D1DIIEb#!i1+GYU%;azd9NVFva9 z7^*~OW-jVu>?WYzaW3{4g@!u$OB&{!vNv<)MfFIie!KYyE=~w3`Q}v QhY%BDkj%|pecVX@0T&d9I{*Lx literal 0 HcmV?d00001 diff --git a/Signal/src/Loki/Redesign/Components/FakeChatView.swift b/Signal/src/Loki/Redesign/Components/FakeChatView.swift index 59eac33e3..2e53bce96 100644 --- a/Signal/src/Loki/Redesign/Components/FakeChatView.swift +++ b/Signal/src/Loki/Redesign/Components/FakeChatView.swift @@ -8,10 +8,11 @@ final class FakeChatView : UIView { } private lazy var chatBubbles = [ - getChatBubble(withText: NSLocalizedString("What is Loki Messenger? A completely decentralised private messaging application for all platforms.", comment: ""), wasSentByCurrentUser: true), - getChatBubble(withText: NSLocalizedString("So no metadata collection, or personally identifiable information? How does it work?", comment: ""), wasSentByCurrentUser: false), - getChatBubble(withText: NSLocalizedString("Through a combination of advanced blockchain techniques including onion routing through Lokinet's private servers.", comment: ""), wasSentByCurrentUser: true), - getChatBubble(withText: NSLocalizedString("Friends don't let friends use compromised messengers. You're welcome.", comment: ""), wasSentByCurrentUser: true) + getChatBubble(withText: NSLocalizedString("What's Loki Messenger?", comment: ""), wasSentByCurrentUser: true), + getChatBubble(withText: NSLocalizedString("It's a secure, decentralized cross-platform private messaging app", comment: ""), wasSentByCurrentUser: false), + getChatBubble(withText: NSLocalizedString("So it doesn't collect my personal information or my conversation metadata? How's it work?", comment: ""), wasSentByCurrentUser: true), + getChatBubble(withText: NSLocalizedString("Using a combination of advanced anonymous routing and end-to-end encryption technologies.", comment: ""), wasSentByCurrentUser: false), + getChatBubble(withText: NSLocalizedString("Friends don't let friends use compromised messengers. You're welcome.", comment: ""), wasSentByCurrentUser: false) ] private lazy var scrollView: UIScrollView = { @@ -55,10 +56,10 @@ final class FakeChatView : UIView { bubbleView.layer.shadowColor = UIColor.black.cgColor bubbleView.layer.shadowRadius = 8 bubbleView.layer.shadowOpacity = 0.64 - let backgroundColor = wasSentByCurrentUser ? Colors.accent : Colors.fakeChatBubbleBackground + let backgroundColor = wasSentByCurrentUser ? Colors.fakeChatBubbleBackground : Colors.accent bubbleView.backgroundColor = backgroundColor let label = UILabel() - let textColor = wasSentByCurrentUser ? Colors.fakeChatBubbleText : Colors.text + let textColor = wasSentByCurrentUser ? Colors.text : Colors.fakeChatBubbleText label.textColor = textColor label.font = .boldSystemFont(ofSize: Values.mediumFontSize) label.numberOfLines = 0 @@ -70,9 +71,9 @@ final class FakeChatView : UIView { bubbleView.pin(.top, to: .top, of: result) result.pin(.bottom, to: .bottom, of: bubbleView) if wasSentByCurrentUser { - bubbleView.pin(.leading, to: .leading, of: result) + bubbleView.pin(.trailing, to: .trailing, of: result) } else { - result.pin(.trailing, to: .trailing, of: bubbleView) + result.pin(.leading, to: .leading, of: bubbleView) } return result } @@ -83,7 +84,7 @@ final class FakeChatView : UIView { chatBubbles.forEach { $0.alpha = 0 } Timer.scheduledTimer(withTimeInterval: Values.fakeChatStartDelay, repeats: false) { [weak self] _ in self?.showChatBubble(at: 0) - Timer.scheduledTimer(withTimeInterval: delayBetweenMessages, repeats: false) { _ in + Timer.scheduledTimer(withTimeInterval: 1.5 * delayBetweenMessages, repeats: false) { _ in self?.showChatBubble(at: 1) Timer.scheduledTimer(withTimeInterval: 1.5 * delayBetweenMessages, repeats: false) { _ in self?.showChatBubble(at: 2) @@ -91,12 +92,19 @@ final class FakeChatView : UIView { guard let self = self else { return } self.scrollView.contentOffset = CGPoint(x: 0, y: self.chatBubbles[0].height() + self.spacing) } - Timer.scheduledTimer(withTimeInterval: delayBetweenMessages, repeats: false) { _ in + Timer.scheduledTimer(withTimeInterval: 1.5 * delayBetweenMessages, repeats: false) { _ in self?.showChatBubble(at: 3) UIView.animate(withDuration: animationDuration) { guard let self = self else { return } self.scrollView.contentOffset = CGPoint(x: 0, y: self.chatBubbles[0].height() + self.spacing + self.chatBubbles[1].height() + self.spacing) } + Timer.scheduledTimer(withTimeInterval: delayBetweenMessages, repeats: false) { _ in + self?.showChatBubble(at: 4) + UIView.animate(withDuration: animationDuration) { + guard let self = self else { return } + self.scrollView.contentOffset = CGPoint(x: 0, y: self.chatBubbles[0].height() + self.spacing + self.chatBubbles[1].height() + self.spacing + self.chatBubbles[2].height() + self.spacing) + } + } } } } diff --git a/Signal/src/Loki/Messaging/FriendRequestView.swift b/Signal/src/Loki/Redesign/Components/FriendRequestView.swift similarity index 64% rename from Signal/src/Loki/Messaging/FriendRequestView.swift rename to Signal/src/Loki/Redesign/Components/FriendRequestView.swift index 68ef42cf1..f4a79c8f5 100644 --- a/Signal/src/Loki/Messaging/FriendRequestView.swift +++ b/Signal/src/Loki/Redesign/Components/FriendRequestView.swift @@ -13,16 +13,22 @@ final class FriendRequestView : UIView { enum Kind : String { case incoming, outgoing } // MARK: Components - private lazy var topSpacer: UIView = { + private lazy var spacer1: UIView = { let result = UIView() - result.autoSetDimension(.height, toSize: 12) + result.set(.height, to: 12) + return result + }() + + private lazy var spacer2: UIView = { + let result = UIView() + result.set(.height, to: Values.mediumSpacing) return result }() private lazy var label: UILabel = { let result = UILabel() - result.textColor = Theme.secondaryColor - result.font = UIFont.ows_dynamicTypeSubheadlineClamped + result.textColor = Colors.text + result.font = .systemFont(ofSize: Values.smallFontSize) result.numberOfLines = 0 result.textAlignment = .center result.lineBreakMode = .byWordWrapping @@ -32,12 +38,10 @@ final class FriendRequestView : UIView { private lazy var buttonStackView: UIStackView = { let result = UIStackView() result.axis = .horizontal + result.spacing = Values.mediumSpacing result.distribution = .fillEqually return result }() - - private lazy var buttonFont = UIFont.ows_dynamicTypeBodyClamped.ows_mediumWeight() - private lazy var buttonHeight = buttonFont.pointSize * 48 / 17 // MARK: Lifecycle @objc init(message: TSMessage) { @@ -54,23 +58,36 @@ final class FriendRequestView : UIView { let mainStackView = UIStackView() mainStackView.axis = .vertical mainStackView.distribution = .fill - mainStackView.addArrangedSubview(topSpacer) + mainStackView.layoutMargins = UIEdgeInsets(top: 0, left: Values.largeSpacing, bottom: 0, right: Values.largeSpacing) + mainStackView.isLayoutMarginsRelativeArrangement = true + mainStackView.addArrangedSubview(spacer1) mainStackView.addArrangedSubview(label) switch kind { case .incoming: + mainStackView.addArrangedSubview(spacer2) mainStackView.addArrangedSubview(buttonStackView) - let acceptButton = OWSFlatButton.button(title: NSLocalizedString("Accept", comment: ""), font: buttonFont, titleColor: .ows_materialBlue, backgroundColor: .white, target: self, selector: #selector(accept)) - acceptButton.setBackgroundColors(upColor: .clear, downColor: .clear) - acceptButton.autoSetDimension(.height, toSize: buttonHeight) - buttonStackView.addArrangedSubview(acceptButton) - let declineButton = OWSFlatButton.button(title: NSLocalizedString("Decline", comment: ""), font: buttonFont, titleColor: .ows_destructiveRed, backgroundColor: .white, target: self, selector: #selector(decline)) - declineButton.setBackgroundColors(upColor: .clear, downColor: .clear) - declineButton.autoSetDimension(.height, toSize: buttonHeight) + let declineButton = UIButton() + declineButton.set(.height, to: Values.mediumButtonHeight) + declineButton.layer.cornerRadius = Values.modalButtonCornerRadius + declineButton.backgroundColor = Colors.buttonBackground + declineButton.titleLabel!.font = .systemFont(ofSize: Values.smallFontSize) + declineButton.setTitleColor(Colors.text, for: UIControl.State.normal) + declineButton.setTitle(NSLocalizedString("Decline", comment: ""), for: UIControl.State.normal) + declineButton.addTarget(self, action: #selector(decline), for: UIControl.Event.touchUpInside) buttonStackView.addArrangedSubview(declineButton) + let acceptButton = UIButton() + acceptButton.set(.height, to: Values.mediumButtonHeight) + acceptButton.layer.cornerRadius = Values.modalButtonCornerRadius + acceptButton.backgroundColor = Colors.accent + acceptButton.titleLabel!.font = .systemFont(ofSize: Values.smallFontSize) + acceptButton.setTitleColor(Colors.text, for: UIControl.State.normal) + acceptButton.setTitle(NSLocalizedString("Accept", comment: ""), for: UIControl.State.normal) + acceptButton.addTarget(self, action: #selector(accept), for: UIControl.Event.touchUpInside) + buttonStackView.addArrangedSubview(acceptButton) case .outgoing: break } addSubview(mainStackView) - mainStackView.autoPin(toEdgesOf: self) + mainStackView.pin(to: self) updateUI() // Observe friend request status changes NotificationCenter.default.addObserver(self, selector: #selector(handleFriendRequestStatusChangedNotification), name: .messageFriendRequestStatusChanged, object: nil) @@ -93,18 +110,19 @@ final class FriendRequestView : UIView { case .incoming: guard let message = message as? TSIncomingMessage else { preconditionFailure() } buttonStackView.isHidden = message.friendRequestStatus != .pending + spacer2.isHidden = buttonStackView.isHidden let format: String = { switch (message.friendRequestStatus) { case .none, .sendingOrFailed: preconditionFailure() - case .pending: return NSLocalizedString("%@ sent you a friend request", comment: "") - case .accepted: return NSLocalizedString("You've accepted %@'s friend request", comment: "") - case .declined: return NSLocalizedString("You've declined %@'s friend request", comment: "") - case .expired: return NSLocalizedString("%@'s friend request has expired", comment: "") + case .pending: return NSLocalizedString("%@ sent you a message request", comment: "") + case .accepted: return NSLocalizedString("You've accepted %@'s message request", comment: "") + case .declined: return NSLocalizedString("You've declined %@'s message request", comment: "") + case .expired: return NSLocalizedString("%@'s message request has expired", comment: "") default: preconditionFailure() } }() let contactID = message.authorId - let displayName = Environment.shared.contactsManager.profileName(forRecipientId: contactID) ?? contactID + let displayName = DisplayNameUtilities.getPrivateChatDisplayName(for: contactID) ?? contactID label.text = String(format: format, displayName) case .outgoing: guard let message = message as? TSOutgoingMessage else { preconditionFailure() } @@ -112,20 +130,20 @@ final class FriendRequestView : UIView { switch (message.friendRequestStatus) { case .none: preconditionFailure() case .sendingOrFailed: return nil - case .pending: return NSLocalizedString("You've sent %@ a friend request", comment: "") - case .accepted: return NSLocalizedString("%@ accepted your friend request", comment: "") + case .pending: return NSLocalizedString("You've sent %@ a message request", comment: "") + case .accepted: return NSLocalizedString("%@ accepted your message request", comment: "") case .declined: preconditionFailure() - case .expired: return NSLocalizedString("Your friend request to %@ has expired", comment: "") + case .expired: return NSLocalizedString("Your message request to %@ has expired", comment: "") default: preconditionFailure() } }() if let format = format { let contactID = message.thread.contactIdentifier()! - let displayName = Environment.shared.contactsManager.profileName(forRecipientId: contactID) ?? contactID + let displayName = DisplayNameUtilities.getPrivateChatDisplayName(for: contactID) ?? contactID label.text = String(format: format, displayName) } label.isHidden = (format == nil) - topSpacer.isHidden = (label.isHidden) + spacer1.isHidden = (label.isHidden) } } @@ -144,14 +162,14 @@ final class FriendRequestView : UIView { // MARK: Measuring @objc static func calculateHeight(message: TSMessage, conversationStyle: ConversationStyle) -> CGFloat { - let width = conversationStyle.contentWidth + let width = conversationStyle.contentWidth - 2 * Values.largeSpacing let dummyFriendRequestView = FriendRequestView(message: message) - let hasTopSpacer = !dummyFriendRequestView.topSpacer.isHidden + let hasTopSpacer = !dummyFriendRequestView.spacer1.isHidden let topSpacing: CGFloat = hasTopSpacer ? 12 : 0 let hasLabel = !dummyFriendRequestView.label.isHidden let labelHeight = hasLabel ? dummyFriendRequestView.label.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)).height : 0 let hasButtonStackView = dummyFriendRequestView.buttonStackView.superview != nil && !dummyFriendRequestView.buttonStackView.isHidden - let buttonHeight = hasButtonStackView ? dummyFriendRequestView.buttonHeight : 0 + let buttonHeight = hasButtonStackView ? Values.mediumButtonHeight + Values.mediumSpacing : 0 // Values.mediumSpacing is the height of the spacer let totalHeight = topSpacing + labelHeight + buttonHeight return totalHeight.rounded(.up) } diff --git a/Signal/src/Loki/Messaging/FriendRequestViewDelegate.swift b/Signal/src/Loki/Redesign/Components/FriendRequestViewDelegate.swift similarity index 100% rename from Signal/src/Loki/Messaging/FriendRequestViewDelegate.swift rename to Signal/src/Loki/Redesign/Components/FriendRequestViewDelegate.swift diff --git a/Signal/src/Loki/Redesign/Style Guide/Values.swift b/Signal/src/Loki/Redesign/Style Guide/Values.swift index eb2466ae2..b19256c81 100644 --- a/Signal/src/Loki/Redesign/Style Guide/Values.swift +++ b/Signal/src/Loki/Redesign/Style Guide/Values.swift @@ -59,6 +59,6 @@ final class Values : NSObject { // MARK: - Animation Values @objc static let fakeChatStartDelay: TimeInterval = 2 @objc static let fakeChatAnimationDuration: TimeInterval = 0.4 - @objc static let fakeChatDelay: TimeInterval = 2 + @objc static let fakeChatDelay: TimeInterval = 2.5 @objc static let fakeChatMessagePopAnimationStartScale: CGFloat = 0.6 } diff --git a/Signal/src/Loki/Redesign/View Controllers/DisplayNameVC.swift b/Signal/src/Loki/Redesign/View Controllers/DisplayNameVC.swift index 505b1f0e0..430a1ad41 100644 --- a/Signal/src/Loki/Redesign/View Controllers/DisplayNameVC.swift +++ b/Signal/src/Loki/Redesign/View Controllers/DisplayNameVC.swift @@ -38,14 +38,14 @@ final class DisplayNameVC : UIViewController { let titleLabel = UILabel() titleLabel.textColor = Colors.text titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) - titleLabel.text = NSLocalizedString("Pick your public display name", comment: "") + titleLabel.text = NSLocalizedString("Pick your display name", comment: "") titleLabel.numberOfLines = 0 titleLabel.lineBreakMode = .byWordWrapping // Set up explanation label let explanationLabel = UILabel() explanationLabel.textColor = Colors.text explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) - explanationLabel.text = "explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation" + explanationLabel.text = "This is how others will be able to recognize you." explanationLabel.numberOfLines = 0 explanationLabel.lineBreakMode = .byWordWrapping // Set up spacers diff --git a/Signal/src/Loki/Redesign/View Controllers/LinkDeviceVC.swift b/Signal/src/Loki/Redesign/View Controllers/LinkDeviceVC.swift index ed09e2d90..40a665b1d 100644 --- a/Signal/src/Loki/Redesign/View Controllers/LinkDeviceVC.swift +++ b/Signal/src/Loki/Redesign/View Controllers/LinkDeviceVC.swift @@ -36,7 +36,7 @@ final class LinkDeviceVC : UIViewController, UIPageViewControllerDataSource, UIP }() private lazy var scanQRCodeWrapperVC: ScanQRCodeWrapperVC = { - let message = NSLocalizedString("Link to your existing device by going into your in-app settings and clicking \"Linked Devices\".", comment: "") + let message = NSLocalizedString("Link to your existing account by going into your in-app settings and clicking \"Linked Devices\".", comment: "") let result = ScanQRCodeWrapperVC(message: message) result.delegate = self return result @@ -156,7 +156,7 @@ private final class EnterPublicKeyVC : UIViewController { let explanationLabel = UILabel() explanationLabel.textColor = Colors.text explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) - explanationLabel.text = "explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation" + explanationLabel.text = "Enter your account's public key to link your device." explanationLabel.numberOfLines = 0 explanationLabel.lineBreakMode = .byWordWrapping // Link button diff --git a/Signal/src/Loki/Redesign/View Controllers/RegisterVC.swift b/Signal/src/Loki/Redesign/View Controllers/RegisterVC.swift index 7f5438476..64fbf26c3 100644 --- a/Signal/src/Loki/Redesign/View Controllers/RegisterVC.swift +++ b/Signal/src/Loki/Redesign/View Controllers/RegisterVC.swift @@ -16,7 +16,7 @@ final class RegisterVC : UIViewController { private lazy var copyPublicKeyButton: Button = { let result = Button(style: .prominentOutline, size: .large) - result.setTitle(NSLocalizedString("Copy Public Key", comment: ""), for: UIControl.State.normal) + result.setTitle(NSLocalizedString("Copy", comment: ""), for: UIControl.State.normal) result.addTarget(self, action: #selector(copyPublicKey), for: UIControl.Event.touchUpInside) return result }() @@ -62,14 +62,14 @@ final class RegisterVC : UIViewController { let titleLabel = UILabel() titleLabel.textColor = Colors.text titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) - titleLabel.text = NSLocalizedString("Say hello to your unique public key", comment: "") + titleLabel.text = NSLocalizedString("Say hello to your Loki Messenger ID", comment: "") titleLabel.numberOfLines = 0 titleLabel.lineBreakMode = .byWordWrapping // Set up explanation label let explanationLabel = UILabel() explanationLabel.textColor = Colors.text explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) - explanationLabel.text = "explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation" + explanationLabel.text = NSLocalizedString("Your Loki Messenger ID is the unique address that people can use to contact you on Loki Messenger. With no connection to your real identity, your Loki Messenger ID is totally anonymous and private by design.", comment: "") explanationLabel.numberOfLines = 0 explanationLabel.lineBreakMode = .byWordWrapping // Set up public key label container @@ -138,7 +138,7 @@ final class RegisterVC : UIViewController { @objc private func enableCopyButton() { copyPublicKeyButton.isUserInteractionEnabled = true UIView.transition(with: copyPublicKeyButton, duration: 0.25, options: .transitionCrossDissolve, animations: { - self.copyPublicKeyButton.setTitle(NSLocalizedString("Copy Public Key", comment: ""), for: UIControl.State.normal) + self.copyPublicKeyButton.setTitle(NSLocalizedString("Copy", comment: ""), for: UIControl.State.normal) }, completion: nil) } diff --git a/Signal/src/Loki/Redesign/View Controllers/RestoreVC.swift b/Signal/src/Loki/Redesign/View Controllers/RestoreVC.swift index f5812f743..82012438f 100644 --- a/Signal/src/Loki/Redesign/View Controllers/RestoreVC.swift +++ b/Signal/src/Loki/Redesign/View Controllers/RestoreVC.swift @@ -61,7 +61,7 @@ final class RestoreVC : UIViewController { let explanationLabel = UILabel() explanationLabel.textColor = Colors.text explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) - explanationLabel.text = "explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation explanation" + explanationLabel.text = "Enter the seed that was given to you when you signed up to restore your account." explanationLabel.numberOfLines = 0 explanationLabel.lineBreakMode = .byWordWrapping // Set up legal label diff --git a/Signal/src/Loki/Redesign/View Controllers/SeedVCV2.swift b/Signal/src/Loki/Redesign/View Controllers/SeedVCV2.swift index 4dcf7387b..6f78d94cb 100644 --- a/Signal/src/Loki/Redesign/View Controllers/SeedVCV2.swift +++ b/Signal/src/Loki/Redesign/View Controllers/SeedVCV2.swift @@ -30,7 +30,7 @@ final class SeedVCV2 : UIViewController { let attributedTitle = NSMutableAttributedString(string: title) attributedTitle.addAttribute(.foregroundColor, value: Colors.accent, range: (title as NSString).range(of: "90%")) result.title = attributedTitle - result.subtitle = NSLocalizedString("Press the covered words to view your seed and secure your account", comment: "") + result.subtitle = NSLocalizedString("Press the redacted words to view your seed and secure your account", comment: "") result.setProgress(0.9, animated: false) return result }() @@ -88,7 +88,7 @@ final class SeedVCV2 : UIViewController { let explanationLabel = UILabel() explanationLabel.textColor = Colors.text explanationLabel.font = .systemFont(ofSize: Values.smallFontSize) - explanationLabel.text = NSLocalizedString("Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your personal information and crypto wallet.", comment: "") + explanationLabel.text = NSLocalizedString("Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your account.", comment: "") explanationLabel.numberOfLines = 0 explanationLabel.lineBreakMode = .byWordWrapping // Set up mnemonic label diff --git a/Signal/src/Models/MessageActions.swift b/Signal/src/Models/MessageActions.swift index c90cc3aee..6bd957746 100644 --- a/Signal/src/Models/MessageActions.swift +++ b/Signal/src/Models/MessageActions.swift @@ -32,7 +32,7 @@ struct MessageActionBuilder { } static func copyPublicKey(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction { - return MenuAction(image: #imageLiteral(resourceName: "table_ic_add_to_existing_contact"), + return MenuAction(image: #imageLiteral(resourceName: "Key"), title: NSLocalizedString("Copy Public Key", comment: ""), subtitle: nil, block: { [weak delegate] _ in delegate?.copyPublicKey(for: conversationViewItem) } diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m index 8d8857d01..3adce8cf8 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m @@ -98,24 +98,19 @@ NS_ASSUME_NONNULL_BEGIN - (void)setAudioIcon:(UIImage *)icon { - OWSAssertDebug(icon.size.height == self.iconSize); - - icon = [icon imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + icon = [icon resizedImageToSize:CGSizeMake(self.iconSize, self.iconSize)]; [_audioPlayPauseButton setImage:icon forState:UIControlStateNormal]; [_audioPlayPauseButton setImage:icon forState:UIControlStateDisabled]; - _audioPlayPauseButton.imageView.tintColor = [UIColor ows_signalBlueColor]; - _audioPlayPauseButton.backgroundColor = [UIColor colorWithWhite:1.f alpha:0.92f]; - _audioPlayPauseButton.layer.cornerRadius = self.iconSize * 0.5f; } - (void)setAudioIconToPlay { - [self setAudioIcon:[UIImage imageNamed:@"audio_play_black_48"]]; + [self setAudioIcon:[UIImage imageNamed:@"CirclePlay"]]; } - (void)setAudioIconToPause { - [self setAudioIcon:[UIImage imageNamed:@"audio_pause_black_48"]]; + [self setAudioIcon:[UIImage imageNamed:@"CirclePause"]]; } - (void)updateAudioProgressView @@ -181,7 +176,7 @@ NS_ASSUME_NONNULL_BEGIN + (CGFloat)vMargin { - return 5.f; + return 0.f; } - (CGFloat)vMargin @@ -205,7 +200,7 @@ NS_ASSUME_NONNULL_BEGIN + (CGFloat)iconSize { - return kStandardAvatarSize; + return 72.f; } - (CGFloat)iconSize @@ -229,7 +224,12 @@ NS_ASSUME_NONNULL_BEGIN _audioPlayPauseButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.audioPlayPauseButton.enabled = NO; [self addArrangedSubview:self.audioPlayPauseButton]; - [self.audioPlayPauseButton setContentHuggingHigh]; + self.audioPlayPauseButton.imageView.contentMode = UIViewContentModeCenter; + [self.audioPlayPauseButton autoSetDimension:ALDimensionWidth toSize:56.f]; + [self.audioPlayPauseButton autoSetDimension:ALDimensionHeight toSize:56.f]; + self.audioPlayPauseButton.imageView.clipsToBounds = NO; + self.audioPlayPauseButton.clipsToBounds = NO; + self.clipsToBounds = NO; [self replaceIconWithDownloadProgressIfNecessary:self.audioPlayPauseButton]; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index c6696fdaa..fe39200bd 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -1591,7 +1591,7 @@ typedef enum : NSUInteger { isAttachmentButtonHidden = false; } [self.inputToolbar setUserInteractionEnabled:isEnabled]; - NSString *placeholderText = isEnabled ? NSLocalizedString(@"Message", "") : NSLocalizedString(@"Pending Friend Request...", ""); + NSString *placeholderText = isEnabled ? NSLocalizedString(@"Message", "") : NSLocalizedString(@"Pending message request", ""); [self.inputToolbar setPlaceholderText:placeholderText]; [self.inputToolbar setAttachmentButtonHidden:isAttachmentButtonHidden]; } diff --git a/Signal/src/ViewControllers/GifPicker/GifPickerViewController.swift b/Signal/src/ViewControllers/GifPicker/GifPickerViewController.swift index 35eacbe00..de94fc828 100644 --- a/Signal/src/ViewControllers/GifPicker/GifPickerViewController.swift +++ b/Signal/src/ViewControllers/GifPicker/GifPickerViewController.swift @@ -37,7 +37,7 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect let thread: TSThread let messageSender: MessageSender - let searchBar: UISearchBar + let searchBar: SearchBar let layout: GifPickerLayout let collectionView: UICollectionView var noResultsView: UILabel? @@ -64,7 +64,7 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect self.thread = thread self.messageSender = messageSender - self.searchBar = OWSSearchBar() + self.searchBar = SearchBar() self.layout = GifPickerLayout() self.collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: self.layout) @@ -148,9 +148,7 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect private func createViews() { - let backgroundColor = (Theme.isDarkThemeEnabled - ? UIColor(white: 0.08, alpha: 1.0) - : Theme.backgroundColor) + let backgroundColor = Colors.navigationBarBackground self.view.backgroundColor = backgroundColor // Block UIKit from adjust insets of collection view which screws up @@ -159,8 +157,6 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect // Search searchBar.delegate = self - searchBar.placeholder = NSLocalizedString("GIF_VIEW_SEARCH_PLACEHOLDER_TEXT", - comment: "Placeholder text for the search field in GIF view") self.view.addSubview(searchBar) searchBar.autoPinWidthToSuperview() @@ -179,7 +175,7 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect // for iPhoneX devices, extends the black background to the bottom edge of the view. let bottomBannerContainer = UIView() - bottomBannerContainer.backgroundColor = UIColor.black + bottomBannerContainer.backgroundColor = Colors.navigationBarBackground self.view.addSubview(bottomBannerContainer) bottomBannerContainer.autoPinWidthToSuperview() bottomBannerContainer.autoPinEdge(.top, to: .bottom, of: self.collectionView) @@ -216,12 +212,18 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect searchErrorView.isUserInteractionEnabled = true searchErrorView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(retryTapped))) - let activityIndicator = UIActivityIndicatorView(style: .gray) + let activityIndicator = UIActivityIndicatorView(style: .whiteLarge) self.activityIndicator = activityIndicator self.view.addSubview(activityIndicator) activityIndicator.autoHCenterInSuperview() activityIndicator.autoAlignAxis(.horizontal, toSameAxisOf: self.collectionView) + let navigationBar = navigationController!.navigationBar + navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationBar.shadowImage = UIImage() + navigationBar.isTranslucent = false + navigationBar.barTintColor = Colors.navigationBarBackground + self.updateContents() } diff --git a/Signal/src/ViewControllers/MediaDetailViewController.m b/Signal/src/ViewControllers/MediaDetailViewController.m index 5aa94b184..3643f7fb7 100644 --- a/Signal/src/ViewControllers/MediaDetailViewController.m +++ b/Signal/src/ViewControllers/MediaDetailViewController.m @@ -274,13 +274,13 @@ NS_ASSUME_NONNULL_BEGIN [playVideoButton addTarget:self action:@selector(playVideo) forControlEvents:UIControlEventTouchUpInside]; - UIImage *playImage = [UIImage imageNamed:@"play_button"]; + UIImage *playImage = [UIImage imageNamed:@"CirclePlay"]; [playVideoButton setBackgroundImage:playImage forState:UIControlStateNormal]; playVideoButton.contentMode = UIViewContentModeScaleAspectFill; [self.view addSubview:playVideoButton]; - CGFloat playVideoButtonWidth = ScaleFromIPhone5(70); + CGFloat playVideoButtonWidth = 72.f; [playVideoButton autoSetDimensionsToSize:CGSizeMake(playVideoButtonWidth, playVideoButtonWidth)]; [playVideoButton autoCenterInSuperview]; } diff --git a/Signal/src/ViewControllers/MediaTileViewController.swift b/Signal/src/ViewControllers/MediaTileViewController.swift index e715aaa4f..01ce4d55c 100644 --- a/Signal/src/ViewControllers/MediaTileViewController.swift +++ b/Signal/src/ViewControllers/MediaTileViewController.swift @@ -84,15 +84,30 @@ public class MediaTileViewController: UICollectionViewController, MediaGalleryDa override public func viewDidLoad() { super.viewDidLoad() - - self.title = MediaStrings.allMedia + + // Loki: Set gradient background + view.backgroundColor = .clear + let gradient = Gradients.defaultLokiBackground + view.setGradient(gradient) + // Loki: Set navigation bar background color + let navigationBar = navigationController!.navigationBar + navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationBar.shadowImage = UIImage() + navigationBar.isTranslucent = false + navigationBar.barTintColor = Colors.navigationBarBackground + // Loki: Customize title + let titleLabel = UILabel() + titleLabel.text = MediaStrings.allMedia + titleLabel.textColor = Colors.text + titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) + navigationItem.titleView = titleLabel guard let collectionView = self.collectionView else { owsFailDebug("collectionView was unexpectedly nil") return } - collectionView.backgroundColor = Theme.darkThemeBackgroundColor + collectionView.backgroundColor = Colors.navigationBarBackground collectionView.register(PhotoGridViewCell.self, forCellWithReuseIdentifier: PhotoGridViewCell.reuseIdentifier) collectionView.register(MediaGallerySectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: MediaGallerySectionHeader.reuseIdentifier) diff --git a/Signal/src/ViewControllers/MenuActionsViewController.swift b/Signal/src/ViewControllers/MenuActionsViewController.swift index d23799801..b466bed99 100644 --- a/Signal/src/ViewControllers/MenuActionsViewController.swift +++ b/Signal/src/ViewControllers/MenuActionsViewController.swift @@ -404,23 +404,21 @@ class MenuActionView: UIButton { } let imageView = UIImageView(image: image) if Theme.isDarkThemeEnabled { - imageView.tintColor = UIColor.ows_gray25 + imageView.tintColor = Colors.text.withAlphaComponent(Values.unimportantElementOpacity) } let imageWidth: CGFloat = 24 imageView.autoSetDimensions(to: CGSize(width: imageWidth, height: imageWidth)) imageView.isUserInteractionEnabled = false let titleLabel = UILabel() - titleLabel.font = UIFont.ows_dynamicTypeBody - titleLabel.textColor = Theme.primaryColor + titleLabel.font = .systemFont(ofSize: Values.mediumFontSize) + titleLabel.textColor = Colors.text titleLabel.text = action.title titleLabel.isUserInteractionEnabled = false let subtitleLabel = UILabel() - subtitleLabel.font = UIFont.ows_dynamicTypeSubheadline - subtitleLabel.textColor = (Theme.isDarkThemeEnabled - ? UIColor.ows_gray25 - : Theme.secondaryColor) + subtitleLabel.font = .systemFont(ofSize: Values.smallFontSize) + subtitleLabel.textColor = Colors.text.withAlphaComponent(Values.unimportantElementOpacity) subtitleLabel.text = action.subtitle subtitleLabel.isUserInteractionEnabled = false @@ -445,15 +443,11 @@ class MenuActionView: UIButton { } private var defaultBackgroundColor: UIColor { - return (Theme.isDarkThemeEnabled - ? UIColor.ows_gray75 - : UIColor.white) + return Colors.cellBackground } private var highlightedBackgroundColor: UIColor { - return (Theme.isDarkThemeEnabled - ? UIColor.ows_gray75 - : UIColor.ows_gray05) + return Colors.cellSelected } override var isHighlighted: Bool { diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 5be8022c8..8efc76090 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -99,8 +99,22 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele self.conversationStyle.viewWidth = view.width() - self.navigationItem.title = NSLocalizedString("MESSAGE_METADATA_VIEW_TITLE", - comment: "Title for the 'message metadata' view.") + // Loki: Set gradient background + view.backgroundColor = .clear + let gradient = Gradients.defaultLokiBackground + view.setGradient(gradient) + // Loki: Set navigation bar background color + let navigationBar = navigationController!.navigationBar + navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationBar.shadowImage = UIImage() + navigationBar.isTranslucent = false + navigationBar.barTintColor = Colors.navigationBarBackground + // Loki: Customize title + let titleLabel = UILabel() + titleLabel.text = NSLocalizedString("MESSAGE_METADATA_VIEW_TITLE", comment: "Title for the 'message metadata' view.") + titleLabel.textColor = Colors.text + titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) + navigationItem.titleView = titleLabel createViews() @@ -154,7 +168,7 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele // MARK: - Create Views private func createViews() { - view.backgroundColor = Theme.backgroundColor + view.backgroundColor = .clear let scrollView = UIScrollView() self.scrollView = scrollView diff --git a/Signal/src/ViewControllers/Photos/ImagePickerController.swift b/Signal/src/ViewControllers/Photos/ImagePickerController.swift index 8ecbd9ae4..c30191517 100644 --- a/Signal/src/ViewControllers/Photos/ImagePickerController.swift +++ b/Signal/src/ViewControllers/Photos/ImagePickerController.swift @@ -59,23 +59,30 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat // ensure images at the end of the list can be scrolled above the bottom buttons let bottomButtonInset = -1 * SendMediaNavigationController.bottomButtonsCenterOffset + SendMediaNavigationController.bottomButtonWidth / 2 collectionView.contentInset.bottom = bottomButtonInset + 8 - view.backgroundColor = .ows_gray95 + view.backgroundColor = Colors.navigationBarBackground // The PhotoCaptureVC needs a shadow behind it's cancel button, so we use a custom icon. // This VC has a visible navbar so doesn't need the shadow, but because the user can // quickly toggle between the Capture and the Picker VC's, we use the same custom "X" // icon here rather than the system "stop" icon so that the spacing matches exactly. // Otherwise there's a noticable shift in the icon placement. - let cancelImage = UIImage(imageLiteralResourceName: "ic_x_with_shadow") + let cancelImage = UIImage(imageLiteralResourceName: "X") let cancelButton = UIBarButtonItem(image: cancelImage, style: .plain, target: self, action: #selector(didPressCancel)) - cancelButton.tintColor = .ows_gray05 + cancelButton.tintColor = Colors.text navigationItem.leftBarButtonItem = cancelButton let titleView = TitleView() titleView.delegate = self titleView.text = photoCollection.localizedTitle() + // Loki: Set navigation bar background color + let navigationBar = navigationController!.navigationBar + navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) + navigationBar.shadowImage = UIImage() + navigationBar.isTranslucent = false + navigationBar.barTintColor = Colors.navigationBarBackground + if #available(iOS 11, *) { // do nothing } else { @@ -86,7 +93,7 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat navigationItem.titleView = titleView self.titleView = titleView - collectionView.backgroundColor = .ows_gray95 + collectionView.backgroundColor = Colors.navigationBarBackground let selectionPanGesture = DirectionalPanGestureRecognizer(direction: [.horizontal], target: self, action: #selector(didPanSelection)) selectionPanGesture.delegate = self @@ -244,7 +251,11 @@ class ImagePickerGridController: UICollectionViewController, PhotoLibraryDelegat // MARK: var lastPageYOffset: CGFloat { - return collectionView.contentSize.height - collectionView.frame.height + var yOffset = collectionView.contentSize.height - collectionView.frame.height + collectionView.contentInset.bottom + if #available(iOS 11.0, *) { + yOffset += view.safeAreaInsets.bottom + } + return yOffset } func scrollToBottom(animated: Bool) { @@ -581,7 +592,7 @@ class TitleView: UIView { let stackView = UIStackView(arrangedSubviews: [label, iconView]) stackView.axis = .horizontal stackView.alignment = .center - stackView.spacing = 5 + stackView.spacing = 8 stackView.isUserInteractionEnabled = true self.stackView = stackView @@ -591,10 +602,10 @@ class TitleView: UIView { addSubview(stackView) stackView.autoPinEdgesToSuperviewEdges() - label.textColor = .ows_gray05 - label.font = UIFont.ows_dynamicTypeBody.ows_mediumWeight() + label.textColor = Colors.text + label.font = .boldSystemFont(ofSize: Values.mediumFontSize) - iconView.tintColor = .ows_gray05 + iconView.tintColor = Colors.text iconView.image = UIImage(named: "navbar_disclosure_down")?.withRenderingMode(.alwaysTemplate) addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(titleTapped))) diff --git a/Signal/src/ViewControllers/Photos/PhotoCollectionPickerController.swift b/Signal/src/ViewControllers/Photos/PhotoCollectionPickerController.swift index a0b070b64..4ff7d0371 100644 --- a/Signal/src/ViewControllers/Photos/PhotoCollectionPickerController.swift +++ b/Signal/src/ViewControllers/Photos/PhotoCollectionPickerController.swift @@ -34,8 +34,8 @@ class PhotoCollectionPickerController: OWSTableViewController, PhotoLibraryDeleg override func viewDidLoad() { super.viewDidLoad() - view.backgroundColor = Theme.darkThemeBackgroundColor - tableView.backgroundColor = Theme.darkThemeBackgroundColor + view.backgroundColor = Colors.navigationBarBackground + tableView.backgroundColor = Colors.navigationBarBackground tableView.separatorColor = .clear library.add(delegate: self) diff --git a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m index 99978ff24..af918a4c3 100644 --- a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m @@ -343,7 +343,7 @@ const CGFloat kIconViewLength = 24; OWSTableSection *mainSection = [OWSTableSection new]; mainSection.customHeaderView = [self mainSectionHeader]; - mainSection.customHeaderHeight = self.isGroupThread ? @(153.f) : @(214.f); + mainSection.customHeaderHeight = self.isGroupThread ? @(147.f) : @(208.f); /** * Loki: Original code @@ -933,9 +933,9 @@ const CGFloat kIconViewLength = 24; UILabel *titleView = [UILabel new]; titleView.textColor = LKColors.text; - titleView.font = [UIFont boldSystemFontOfSize:LKValues.veryLargeFontSize]; + titleView.font = [UIFont boldSystemFontOfSize:LKValues.largeFontSize]; titleView.lineBreakMode = NSLineBreakByTruncatingTail; - titleView.text = self.threadName; + titleView.text = (self.threadName != nil && self.threadName.length > 0) ? self.threadName : @"Anonymous"; UIStackView *stackView = [[UIStackView alloc] initWithArrangedSubviews:@[ profilePictureView, titleView ]]; stackView.axis = UILayoutConstraintAxisVertical; diff --git a/Signal/src/views/PhotoGridViewCell.swift b/Signal/src/views/PhotoGridViewCell.swift index d7faa0762..9af59c17f 100644 --- a/Signal/src/views/PhotoGridViewCell.swift +++ b/Signal/src/views/PhotoGridViewCell.swift @@ -57,12 +57,12 @@ public class PhotoGridViewCell: UICollectionViewCell { self.highlightedView = UIView() highlightedView.alpha = 0.2 - highlightedView.backgroundColor = Theme.darkThemePrimaryColor + highlightedView.backgroundColor = Colors.cellSelected highlightedView.isHidden = true self.selectedView = UIView() selectedView.alpha = 0.3 - selectedView.backgroundColor = Theme.darkThemeBackgroundColor + selectedView.backgroundColor = Colors.cellSelected selectedView.isHidden = true super.init(frame: frame) diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 3e0cd80b4..9c80a38b9 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -2573,20 +2573,20 @@ "Calculating proof of work" = "Calculating proof of work"; "Failed to calculate proof of work." = "Failed to calculate proof of work."; "Share Public Key" = "Share Public Key"; -"%@ sent you a friend request" = "%@ sent you a friend request"; +"%@ sent you a message request" = "%@ sent you a message request"; "Accept" = "Accept"; "Decline" = "Decline"; -"Pending Friend Request..." = "Pending Friend Request..."; +"Pending message request" = "Pending message request"; "New Message" = "New Message"; "Secure session reset in progress" = "Secure session reset in progress"; "Secure session reset done" = "Secure session reset done"; "Loki Messenger" = "Loki Messenger"; -"You've sent %@ a friend request" = "You've sent %@ a friend request"; -"You've declined %@'s friend request" = "You've declined %@'s friend request"; -"You've accepted %@'s friend request" = "You've accepted %@'s friend request"; -"%@ accepted your friend request" = "%@ accepted your friend request"; -"%@'s friend request has expired" = "%@'s friend request has expired"; -"Your friend request to %@ has expired" = "Your friend request to %@ has expired"; +"You've sent %@ a message request" = "You've sent %@ a message request"; +"You've declined %@'s message request" = "You've declined %@'s message request"; +"You've accepted %@'s message request" = "You've accepted %@'s message request"; +"%@ accepted your message request" = "%@ accepted your message request"; +"%@'s message request has expired" = "%@'s message request has expired"; +"Your message request to %@ has expired" = "Your message request to %@ has expired"; "Show Seed" = "Show Seed"; "Your Seed" = "Your Seed"; "Unlock Loki Messenger's screen using Touch ID, Face ID, or your iOS device passcode. You can still answer incoming calls and receive message notifications while Screen Lock is enabled. Loki Messenger's notification settings allow you to customize the information that is displayed." = "Unlock Loki Messenger's screen using Touch ID, Face ID, or your iOS device passcode. You can still answer incoming calls and receive message notifications while Screen Lock is enabled. Loki Messenger's notification settings allow you to customize the information that is displayed."; @@ -2725,16 +2725,17 @@ "Clear" = "Clear"; "Enter a display name" = "Enter a display name"; "Your Loki Messenger begins here..." = "Your Loki Messenger begins here..."; -"What is Loki Messenger? A completely decentralised private messaging application for all platforms." = "What is Loki Messenger? A completely decentralised private messaging application for all platforms."; -"So no metadata collection, or personally identifiable information? How does it work?" = "So no metadata collection, or personally identifiable information? How does it work?"; -"Through a combination of advanced blockchain techniques including onion routing through Lokinet's private servers." = "Through a combination of advanced blockchain techniques including onion routing through Lokinet's private servers."; +"What's Loki Messenger?" = "What's Loki Messenger?"; +"It's a secure, decentralized cross-platform private messaging app" = "It's a secure, decentralized cross-platform private messaging app"; +"So it doesn't collect my personal information or my conversation metadata? How's it work?" = "So it doesn't collect my personal information or my conversation metadata? How's it work?"; +"Using a combination of advanced anonymous routing and end-to-end encryption technologies." = "Using a combination of advanced anonymous routing and end-to-end encryption technologies."; "Friends don't let friends use compromised messengers. You're welcome." = "Friends don't let friends use compromised messengers. You're welcome."; "Create Account" = "Create Account"; "Continue your Loki Messenger" = "Continue your Loki Messenger"; -"Say hello to your unique public key" = "Say hello to your unique public key"; +"Say hello to your Loki Messenger ID" = "Say hello to your Loki Messenger ID"; "Continue" = "Continue"; "Copy Public Key" = "Copy Public Key"; -"Pick your public display name" = "Pick your public display name"; +"Pick your display name" = "Pick your display name"; "Enter a display name" = "Enter a display name"; "Restore your account using your seed" = "Restore your account using your seed"; "Enter your seed" = "Enter your seed"; @@ -2749,12 +2750,13 @@ "Continue" = "Continue"; "Your Seed" = "Your Seed"; "Meet your seed" = "Meet your seed"; -"Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your personal information and crypto wallet." = "Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your personal information and crypto wallet."; -"Press the covered words to view your seed and secure your account" = "Press the covered words to view your seed and secure your account"; +"Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your account." = "Think of this as the crypto-equivalent of a social security number. This allows whomever has it complete access to your account."; +"Press the redacted words to view your seed and secure your account" = "Press the redacted words to view your seed and secure your account"; "Hold to reveal" = "Hold to reveal"; "Make sure to store your seed in a safe place" = "Make sure to store your seed in a safe place"; "Link to an existing account" = "Link to an existing account"; "Enter your public key" = "Enter your public key"; -"Link to your existing device by going into your in-app settings and clicking \"Linked Devices\"." = "Link to your existing device by going into your in-app settings and clicking \"Linked Devices\"."; +"Link to your existing account by going into your in-app settings and clicking \"Linked Devices\"." = "Link to your existing account by going into your in-app settings and clicking \"Linked Devices\"."; "Create a new account on your other device and click \"Link to an existing account\" to start the linking process" = "Create a new account on your other device and click \"Link to an existing account\" to start the linking process"; "Group Settings" = "Group Settings"; +"Your Loki Messenger ID is the unique address that people can use to contact you on Loki Messenger. With no connection to your real identity, your Loki Messenger ID is totally anonymous and private by design." = "Your Loki Messenger ID is the unique address that people can use to contact you on Loki Messenger. With no connection to your real identity, your Loki Messenger ID is totally anonymous and private by design.";