From 1528f6f705b4403e6202161db2ca79e01fb77afa Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 22 Jun 2018 11:00:19 -0600 Subject: [PATCH 1/3] Fix archive/outage banner. // FREEBIE --- Signal/src/views/ReminderView.swift | 51 +++++++++++------------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/Signal/src/views/ReminderView.swift b/Signal/src/views/ReminderView.swift index 2e50473ac..adb5ec6e7 100644 --- a/Signal/src/views/ReminderView.swift +++ b/Signal/src/views/ReminderView.swift @@ -73,49 +73,36 @@ class ReminderView: UIView { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(gestureRecognizer:))) self.addGestureRecognizer(tapGesture) - let container = UIView() + let container = UIStackView() + container.axis = .horizontal + container.alignment = .center + container.isLayoutMarginsRelativeArrangement = true self.addSubview(container) - container.autoPinWidthToSuperview(withMargin: 16) - switch (mode) { - case .nag: - container.autoPinHeightToSuperview(withMargin: 16) - case .explanation: - container.autoPinHeightToSuperview(withMargin: 12) - } - - // Margin: top and bottom 12 left and right 16. + container.layoutMargins = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16) + container.autoPinToSuperviewEdges() // Label label.font = UIFont.ows_dynamicTypeSubheadline - container.addSubview(label) + container.addArrangedSubview(label) label.textColor = UIColor.black.withAlphaComponent(0.9) label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping - label.autoPinLeadingToSuperviewMargin() - label.autoPinEdge(toSuperviewEdge: .top) - label.autoPinEdge(toSuperviewEdge: .bottom) // Show the disclosure indicator if this reminder has a tap action. - if tapAction == nil { - return - } - - // Icon - let iconName = (self.isRTL() ? "system_disclosure_indicator_rtl" : "system_disclosure_indicator") - guard let iconImage = UIImage(named: iconName) else { - owsFail("\(logTag) missing icon.") - return + if tapAction != nil { + // Icon + let iconName = (self.isRTL() ? "system_disclosure_indicator_rtl" : "system_disclosure_indicator") + guard let iconImage = UIImage(named: iconName) else { + owsFail("\(logTag) missing icon.") + return + } + let iconView = UIImageView(image: iconImage.withRenderingMode(.alwaysTemplate)) + iconView.contentMode = .scaleAspectFit + iconView.tintColor = UIColor.black.withAlphaComponent(0.6) + iconView.autoSetDimension(.width, toSize: 13) + container.addArrangedSubview(iconView) } - let iconView = UIImageView(image: iconImage.withRenderingMode(.alwaysTemplate)) - iconView.contentMode = .scaleAspectFit - iconView.tintColor = UIColor.black.withAlphaComponent(0.6) - container.addSubview(iconView) - - iconView.autoPinLeading(toTrailingEdgeOf: label, offset: 28) - iconView.autoPinTrailingToSuperviewMargin() - iconView.autoVCenterInSuperview() - iconView.autoSetDimension(.width, toSize: 13) } @objc func handleTap(gestureRecognizer: UIGestureRecognizer) { From 66ebb7b787cd9f870cdff0db30d8e6a30841b818 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 22 Jun 2018 11:42:59 -0600 Subject: [PATCH 2/3] Simplify show/hide with stack view // FREEBIE --- .../HomeView/HomeViewController.m | 44 +++++-------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/Signal/src/ViewControllers/HomeView/HomeViewController.m b/Signal/src/ViewControllers/HomeView/HomeViewController.m index 3e88d2ae1..56bcf209b 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeView/HomeViewController.m @@ -76,10 +76,10 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations // Views -@property (nonatomic) NSLayoutConstraint *hideDeregisteredViewConstraint; -@property (nonatomic) NSLayoutConstraint *hideArchiveReminderViewConstraint; -@property (nonatomic) NSLayoutConstraint *hideMissingContactsPermissionViewConstraint; -@property (nonatomic) NSLayoutConstraint *outageViewConstraint; +@property (nonatomic, readonly) UIView *deregisteredView; +@property (nonatomic, readonly) UIView *outageView; +@property (nonatomic, readonly) UIView *archiveReminderView; +@property (nonatomic, readonly) UIView *missingContactsPermissionView; @property (nonatomic) TSThread *lastThread; @@ -242,23 +242,20 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations } [RegistrationUtils showReregistrationUIFromViewController:strongSelf]; }]; + _deregisteredView = deregisteredView; [reminderStackView addArrangedSubview:deregisteredView]; - self.hideDeregisteredViewConstraint = [deregisteredView autoSetDimension:ALDimensionHeight toSize:0]; - self.hideDeregisteredViewConstraint.priority = UILayoutPriorityRequired; ReminderView *outageView = [ReminderView nagWithText:NSLocalizedString(@"OUTAGE_WARNING", @"Label warning the user that the Signal service may be down.") tapAction:nil]; + _outageView = outageView; [reminderStackView addArrangedSubview:outageView]; - self.outageViewConstraint = [outageView autoSetDimension:ALDimensionHeight toSize:0]; - self.outageViewConstraint.priority = UILayoutPriorityRequired; ReminderView *archiveReminderView = [ReminderView explanationWithText:NSLocalizedString(@"INBOX_VIEW_ARCHIVE_MODE_REMINDER", @"Label reminding the user that they are in archive mode.")]; + _archiveReminderView = archiveReminderView; [reminderStackView addArrangedSubview:archiveReminderView]; - self.hideArchiveReminderViewConstraint = [archiveReminderView autoSetDimension:ALDimensionHeight toSize:0]; - self.hideArchiveReminderViewConstraint.priority = UILayoutPriorityRequired; ReminderView *missingContactsPermissionView = [ReminderView nagWithText:NSLocalizedString(@"INBOX_VIEW_MISSING_CONTACTS_PERMISSION", @@ -266,10 +263,8 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations tapAction:^{ [[UIApplication sharedApplication] openSystemSettings]; }]; + _missingContactsPermissionView = missingContactsPermissionView; [reminderStackView addArrangedSubview:missingContactsPermissionView]; - self.hideMissingContactsPermissionViewConstraint = - [missingContactsPermissionView autoSetDimension:ALDimensionHeight toSize:0]; - self.hideMissingContactsPermissionViewConstraint.priority = UILayoutPriorityRequired; self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; self.tableView.delegate = self; @@ -308,25 +303,10 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations - (void)updateReminderViews { - BOOL shouldHideArchiveReminderView = self.homeViewMode != HomeViewMode_Archive; - BOOL shouldHideMissingContactsPermissionView = !self.shouldShowMissingContactsPermissionView; - BOOL shouldHideDeregisteredView = !TSAccountManager.sharedInstance.isDeregistered; - BOOL shouldHideOutageView = !OutageDetection.sharedManager.hasOutage; - - if (self.hideArchiveReminderViewConstraint.active == shouldHideArchiveReminderView - && self.hideMissingContactsPermissionViewConstraint.active == shouldHideMissingContactsPermissionView - && self.hideDeregisteredViewConstraint.active == shouldHideDeregisteredView - && self.outageViewConstraint.active == shouldHideOutageView) { - return; - } - - self.hideArchiveReminderViewConstraint.active = shouldHideArchiveReminderView; - self.hideMissingContactsPermissionViewConstraint.active = shouldHideMissingContactsPermissionView; - self.hideDeregisteredViewConstraint.active = shouldHideDeregisteredView; - self.outageViewConstraint.active = shouldHideOutageView; - - [self.view setNeedsLayout]; - [self.view layoutSubviews]; + self.archiveReminderView.hidden = self.homeViewMode != HomeViewMode_Archive; + self.missingContactsPermissionView.hidden = !self.shouldShowMissingContactsPermissionView; + self.deregisteredView.hidden = !TSAccountManager.sharedInstance.isDeregistered; + self.outageView.hidden = !OutageDetection.sharedManager.hasOutage; } - (void)viewDidLoad From 9f06163b76420f022ea9f5ecfb688a5459ba15a8 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 22 Jun 2018 11:50:24 -0600 Subject: [PATCH 3/3] Fix contacts reminder view We had a guard that prevented 'called at least once' from ever getting set when contacts access was disabled. // FREEBIE --- .../src/ViewControllers/HomeView/HomeViewController.m | 11 +---------- SignalMessaging/contacts/OWSContactsManager.h | 1 + SignalMessaging/contacts/OWSContactsManager.m | 5 +++++ SignalMessaging/contacts/SystemContactsFetcher.swift | 5 +++++ 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Signal/src/ViewControllers/HomeView/HomeViewController.m b/Signal/src/ViewControllers/HomeView/HomeViewController.m index 56bcf209b..1029f845d 100644 --- a/Signal/src/ViewControllers/HomeView/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeView/HomeViewController.m @@ -304,7 +304,7 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations - (void)updateReminderViews { self.archiveReminderView.hidden = self.homeViewMode != HomeViewMode_Archive; - self.missingContactsPermissionView.hidden = !self.shouldShowMissingContactsPermissionView; + self.missingContactsPermissionView.hidden = !self.contactsManager.isSystemContactsDenied; self.deregisteredView.hidden = !TSAccountManager.sharedInstance.isDeregistered; self.outageView.hidden = !OutageDetection.sharedManager.hasOutage; } @@ -699,15 +699,6 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; } -- (BOOL)shouldShowMissingContactsPermissionView -{ - if (!self.contactsManager.systemContactsHaveBeenRequestedAtLeastOnce) { - return NO; - } - - return !self.contactsManager.isSystemContactsAuthorized; -} - #pragma mark - Table View Data Source // Returns YES IFF this value changes. diff --git a/SignalMessaging/contacts/OWSContactsManager.h b/SignalMessaging/contacts/OWSContactsManager.h index 3a34898ba..6df58f7c0 100644 --- a/SignalMessaging/contacts/OWSContactsManager.h +++ b/SignalMessaging/contacts/OWSContactsManager.h @@ -41,6 +41,7 @@ extern NSString *const OWSContactsManagerSignalAccountsDidChangeNotification; // Must call `requestSystemContactsOnce` before accessing this method @property (nonatomic, readonly) BOOL isSystemContactsAuthorized; +@property (nonatomic, readonly) BOOL isSystemContactsDenied; @property (nonatomic, readonly) BOOL systemContactsHaveBeenRequestedAtLeastOnce; @property (nonatomic, readonly) BOOL supportsContactEditing; diff --git a/SignalMessaging/contacts/OWSContactsManager.m b/SignalMessaging/contacts/OWSContactsManager.m index 47a78cf0e..ae622e4d5 100644 --- a/SignalMessaging/contacts/OWSContactsManager.m +++ b/SignalMessaging/contacts/OWSContactsManager.m @@ -129,6 +129,11 @@ NSString *const OWSContactsManagerSignalAccountsDidChangeNotification return self.systemContactsFetcher.isAuthorized; } +- (BOOL)isSystemContactsDenied +{ + return self.systemContactsFetcher.isDenied; +} + - (BOOL)systemContactsHaveBeenRequestedAtLeastOnce { return self.systemContactsFetcher.systemContactsHaveBeenRequestedAtLeastOnce; diff --git a/SignalMessaging/contacts/SystemContactsFetcher.swift b/SignalMessaging/contacts/SystemContactsFetcher.swift index 2876ae0e2..652e53736 100644 --- a/SignalMessaging/contacts/SystemContactsFetcher.swift +++ b/SignalMessaging/contacts/SystemContactsFetcher.swift @@ -170,6 +170,11 @@ public class SystemContactsFetcher: NSObject { return self.authorizationStatus == .authorized } + @objc + public var isDenied: Bool { + return self.authorizationStatus == .denied + } + @objc public private(set) var systemContactsHaveBeenRequestedAtLeastOnce = false private var hasSetupObservation = false