From 605d2d34af8eb3c57570bb91c8a95e8766efca84 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 28 Aug 2019 13:47:56 +1000 Subject: [PATCH 1/5] Change Loki Messenger Updates feed ID --- Signal/src/AppDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 91670eb03..2d28aebda 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1499,7 +1499,7 @@ static NSTimeInterval launchStartedAt; - (LKRSSFeed *)lokiMessengerUpdatesFeed { - return [[LKRSSFeed alloc] initWithId:@"loki.network.messenger-updates" server:@"https://loki.network/category/messenger-updates/feed/" displayName:NSLocalizedString(@"Loki Messenger Updates", @"") isDeletable:false]; + return [[LKRSSFeed alloc] initWithId:@"loki.network.messenger-updates.feed" server:@"https://loki.network/category/messenger-updates/feed/" displayName:NSLocalizedString(@"Loki Messenger Updates", @"") isDeletable:false]; } - (void)createGroupChatsIfNeeded From 1313c9c8d3ab56d91e757a941d49d455dd97fae9 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 28 Aug 2019 16:22:15 +1000 Subject: [PATCH 2/5] Show logo on landing screen --- .../OnboardingSplashViewController.swift | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/Signal/src/ViewControllers/Registration/OnboardingSplashViewController.swift b/Signal/src/ViewControllers/Registration/OnboardingSplashViewController.swift index 6743b9a8a..4cd38c068 100644 --- a/Signal/src/ViewControllers/Registration/OnboardingSplashViewController.swift +++ b/Signal/src/ViewControllers/Registration/OnboardingSplashViewController.swift @@ -14,41 +14,41 @@ public class OnboardingSplashViewController: OnboardingBaseViewController { view.backgroundColor = Theme.backgroundColor view.layoutMargins = .zero - let heroImage = UIImage(named: "onboarding_splash_hero") - let heroImageView = UIImageView(image: heroImage) - heroImageView.contentMode = .scaleAspectFit - heroImageView.layer.minificationFilter = .trilinear - heroImageView.layer.magnificationFilter = .trilinear - heroImageView.setCompressionResistanceLow() - heroImageView.setContentHuggingVerticalLow() - heroImageView.accessibilityIdentifier = "onboarding.splash." + "heroImageView" - let titleLabel = self.createTitleLabel(text: NSLocalizedString("Loki Messenger", comment: "")) view.addSubview(titleLabel) titleLabel.autoPinEdges(toSuperviewMarginsExcludingEdge: .bottom) titleLabel.accessibilityIdentifier = "onboarding.splash." + "titleLabel" - let explanationLabel = UILabel() - explanationLabel.text = NSLocalizedString("Privacy Policy", comment: "") - explanationLabel.textColor = .ows_materialBlue - explanationLabel.font = UIFont.ows_dynamicTypeSubheadlineClamped - explanationLabel.numberOfLines = 0 - explanationLabel.textAlignment = .center - explanationLabel.lineBreakMode = .byWordWrapping - explanationLabel.isUserInteractionEnabled = true - explanationLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(explanationLabelTapped))) - explanationLabel.accessibilityIdentifier = "onboarding.splash." + "explanationLabel" + let lokiLogo = UIImage(named: "LokiLogo") + let lokiLogoImageView = UIImageView(image: lokiLogo) + lokiLogoImageView.accessibilityIdentifier = "onboarding.splash." + "lokiLogoImageView" + lokiLogoImageView.autoSetDimension(.height, toSize: 71) + lokiLogoImageView.contentMode = .scaleAspectFit + + let lokiLogoContainer = UIView() + view.setContentHuggingVerticalLow() + view.setCompressionResistanceVerticalLow() + lokiLogoContainer.addSubview(lokiLogoImageView) + + let privacyPolicyLabel = UILabel() + privacyPolicyLabel.text = NSLocalizedString("Privacy Policy", comment: "") + privacyPolicyLabel.textColor = .ows_materialBlue + privacyPolicyLabel.font = UIFont.ows_dynamicTypeSubheadlineClamped + privacyPolicyLabel.numberOfLines = 0 + privacyPolicyLabel.textAlignment = .center + privacyPolicyLabel.lineBreakMode = .byWordWrapping + privacyPolicyLabel.isUserInteractionEnabled = true + privacyPolicyLabel.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(explanationLabelTapped))) + privacyPolicyLabel.accessibilityIdentifier = "onboarding.splash." + "explanationLabel" - let continueButton = self.createButton(title: NSLocalizedString("BUTTON_CONTINUE", - comment: "Label for 'continue' button."), - selector: #selector(continuePressed)) + let continueButton = self.createButton(title: NSLocalizedString("BUTTON_CONTINUE", comment: "Label for 'continue' button."), selector: #selector(continuePressed)) view.addSubview(continueButton) continueButton.accessibilityIdentifier = "onboarding.splash." + "continueButton" - + let stackView = UIStackView(arrangedSubviews: [ titleLabel, - UIView.vStretchingSpacer(), - explanationLabel, + lokiLogoContainer, + privacyPolicyLabel, UIView.spacer(withHeight: 24), continueButton ]) @@ -60,6 +60,7 @@ public class OnboardingSplashViewController: OnboardingBaseViewController { stackView.autoPinWidthToSuperview() stackView.autoPin(toTopLayoutGuideOf: self, withInset: 0) stackView.autoPin(toBottomLayoutGuideOf: self, withInset: 0) + lokiLogoImageView.autoCenterInSuperview() } // MARK: - Events From 9bee25f6c6acfd7f980747f7849a67e213aae681 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 28 Aug 2019 16:38:20 +1000 Subject: [PATCH 3/5] Clean --- Signal/src/Loki/LokiRSSFeedPoller.swift | 2 +- Signal/src/Loki/NewConversationViewController.swift | 6 +++--- SignalServiceKit/src/Loki/API/LokiAPI.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Signal/src/Loki/LokiRSSFeedPoller.swift b/Signal/src/Loki/LokiRSSFeedPoller.swift index 4539a851a..4cac9710b 100644 --- a/Signal/src/Loki/LokiRSSFeedPoller.swift +++ b/Signal/src/Loki/LokiRSSFeedPoller.swift @@ -35,7 +35,7 @@ public final class LokiRSSFeedPoller : NSObject { guard let title = item.title, let description = item.description, let date = item.pubDate else { return } let timestamp = UInt64(date.timeIntervalSince1970 * 1000) let urlRegex = try! NSRegularExpression(pattern: "]*?\\s+)?href=\"([^\"]*)\".*?>(.*?)<.*?\\/a>") - var bodyAsHTML = "\(title)
\(description)" + var bodyAsHTML = "\(title)

\(description)".replacingOccurrences(of: "

", with: "


") while true { guard let match = urlRegex.firstMatch(in: bodyAsHTML, options: [], range: NSRange(location: 0, length: bodyAsHTML.utf16.count)) else { break } let matchRange = match.range(at: 0) diff --git a/Signal/src/Loki/NewConversationViewController.swift b/Signal/src/Loki/NewConversationViewController.swift index 8d41efe70..a7e89efcb 100644 --- a/Signal/src/Loki/NewConversationViewController.swift +++ b/Signal/src/Loki/NewConversationViewController.swift @@ -44,7 +44,7 @@ final class NewConversationViewController : OWSViewController, OWSQRScannerDeleg // Next button let nextButtonFont = UIFont.ows_dynamicTypeBodyClamped.ows_mediumWeight() let nextButtonHeight = nextButtonFont.pointSize * 48 / 17 - let nextButton = OWSFlatButton.button(title: NSLocalizedString("Next", comment: ""), font: nextButtonFont, titleColor: .white, backgroundColor: .lokiGreen(), target: self, selector: #selector(startNewConversationIfPossible)) + let nextButton = OWSFlatButton.button(title: NSLocalizedString("Next", comment: ""), font: nextButtonFont, titleColor: .white, backgroundColor: .lokiGreen(), target: self, selector: #selector(handleNextButtonTapped)) nextButton.autoSetDimension(.height, toSize: nextButtonHeight) // Stack view let stackView = UIStackView(arrangedSubviews: [ @@ -95,12 +95,12 @@ final class NewConversationViewController : OWSViewController, OWSQRScannerDeleg startNewConversationIfPossible(with: hexEncodedPublicKey) } - private func handleNextButtonTapped() { + @objc private func handleNextButtonTapped() { let hexEncodedPublicKey = publicKeyTextField.text?.trimmingCharacters(in: .whitespaces) ?? "" startNewConversationIfPossible(with: hexEncodedPublicKey) } - @objc private func startNewConversationIfPossible(with hexEncodedPublicKey: String) { + private func startNewConversationIfPossible(with hexEncodedPublicKey: String) { if !ECKeyPair.isValidHexEncodedPublicKey(candidate: hexEncodedPublicKey) { let alert = UIAlertController(title: NSLocalizedString("Invalid Public Key", comment: ""), message: NSLocalizedString("Please check the public key you entered and try again.", comment: ""), preferredStyle: .alert) alert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default, handler: nil)) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index a79a45eac..04e74f481 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -12,7 +12,7 @@ public final class LokiAPI : NSObject { private static let defaultTimeout: TimeInterval = 20 private static let longPollingTimeout: TimeInterval = 40 public static let defaultMessageTTL: UInt64 = 24 * 60 * 60 * 1000 - internal static var powDifficulty: UInt = 100 + internal static var powDifficulty: UInt = 40 // MARK: Types public typealias RawResponse = Any From 7acfa409153069915c6d9b52448968bd3e246e14 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 28 Aug 2019 15:49:16 +1000 Subject: [PATCH 4/5] Don't allow input on rss groups. --- .../ConversationView/ConversationViewController.m | 12 +++++++++++- .../src/Contacts/Threads/TSGroupThread.h | 1 + .../src/Contacts/Threads/TSGroupThread.m | 6 ++++++ SignalServiceKit/src/Loki/API/LokiRSSFeed.swift | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 8947a9239..58eb2626c 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -564,6 +564,16 @@ typedef enum : NSUInteger { return !groupThread.isLocalUserInGroup; } +- (BOOL)isRSSGroup +{ + if (![_thread isKindOfClass:[TSGroupThread class]]) { + return NO; + } + + TSGroupThread *groupThread = (TSGroupThread *)self.thread; + return groupThread.isRSS; +} + - (void)hideInputIfNeeded { if (_peek) { @@ -572,7 +582,7 @@ typedef enum : NSUInteger { return; } - if (self.userLeftGroup) { + if (self.userLeftGroup || self.isRSSGroup) { self.inputToolbar.hidden = YES; // user has requested they leave the group. further sends disallowed [self dismissKeyBoard]; } else { diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h index bc214f93b..8fb376da2 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h @@ -16,6 +16,7 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; @interface TSGroupThread : TSThread @property (nonatomic, strong) TSGroupModel *groupModel; +@property (nonatomic, readonly) BOOL isRSS; + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel; + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index af20285bb..7110d7921 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -266,6 +266,12 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific return [self.class stableColorNameForNewConversationWithString:[self threadIdFromGroupId:groupId]]; } +- (BOOL)isRSS +{ + NSString *groupID = [[NSString alloc] initWithData:self.groupModel.groupId encoding:NSUTF8StringEncoding]; + return groupID != nil && [groupID containsString:@"rss:"]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Loki/API/LokiRSSFeed.swift b/SignalServiceKit/src/Loki/API/LokiRSSFeed.swift index 44a4807a8..96daef891 100644 --- a/SignalServiceKit/src/Loki/API/LokiRSSFeed.swift +++ b/SignalServiceKit/src/Loki/API/LokiRSSFeed.swift @@ -7,7 +7,7 @@ public final class LokiRSSFeed : NSObject { @objc public let isDeletable: Bool @objc public init(id: String, server: String, displayName: String, isDeletable: Bool) { - self.id = id + self.id = "rss://\(id)" self.server = server self.displayName = displayName self.isDeletable = isDeletable From d4b8dd08757bc84e58b30da8e5a89192e6673a5a Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Wed, 28 Aug 2019 16:49:47 +1000 Subject: [PATCH 5/5] Clean --- .../ConversationView/ConversationViewController.m | 13 +++++-------- .../src/Contacts/Threads/TSGroupThread.h | 2 +- .../src/Contacts/Threads/TSGroupThread.m | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 58eb2626c..622fa3195 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -564,14 +564,11 @@ typedef enum : NSUInteger { return !groupThread.isLocalUserInGroup; } -- (BOOL)isRSSGroup +- (BOOL)isRSSFeed { - if (![_thread isKindOfClass:[TSGroupThread class]]) { - return NO; - } - - TSGroupThread *groupThread = (TSGroupThread *)self.thread; - return groupThread.isRSS; + if (![_thread isKindOfClass:[TSGroupThread class]]) { return NO; } + TSGroupThread *thread = (TSGroupThread *)self.thread; + return thread.isRSSFeed; } - (void)hideInputIfNeeded @@ -582,7 +579,7 @@ typedef enum : NSUInteger { return; } - if (self.userLeftGroup || self.isRSSGroup) { + if (self.userLeftGroup || self.isRSSFeed) { self.inputToolbar.hidden = YES; // user has requested they leave the group. further sends disallowed [self dismissKeyBoard]; } else { diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h index 8fb376da2..e38fa3314 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h @@ -16,7 +16,7 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; @interface TSGroupThread : TSThread @property (nonatomic, strong) TSGroupModel *groupModel; -@property (nonatomic, readonly) BOOL isRSS; +@property (nonatomic, readonly) BOOL isRSSFeed; + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel; + (instancetype)getOrCreateThreadWithGroupModel:(TSGroupModel *)groupModel diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 7110d7921..c7b5b135a 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -266,10 +266,10 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific return [self.class stableColorNameForNewConversationWithString:[self threadIdFromGroupId:groupId]]; } -- (BOOL)isRSS +- (BOOL)isRSSFeed { NSString *groupID = [[NSString alloc] initWithData:self.groupModel.groupId encoding:NSUTF8StringEncoding]; - return groupID != nil && [groupID containsString:@"rss:"]; + return groupID != nil && [groupID hasPrefix:@"rss://"]; } @end