From c7942fb2db41617f6f95b50d26b06e3402cb3e8f Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 20 Apr 2020 16:55:47 -0300 Subject: [PATCH 01/14] Revise table section header and footer backgrounds. --- .../AppSettings/AboutTableViewController.m | 2 +- .../AdvancedSettingsTableViewController.m | 2 +- ...ppearanceSettingsTableViewController.swift | 2 +- .../AppSettings/BlockListViewController.m | 2 +- .../DomainFrontingCountryViewController.m | 2 +- ...otificationSettingsOptionsViewController.m | 2 +- .../NotificationSettingsViewController.m | 2 +- .../OWSBackupSettingsViewController.m | 2 +- .../OWSSoundSettingsViewController.m | 2 +- .../PrivacySettingsTableViewController.m | 2 +- .../OWS2FASettingsViewController.m | 2 +- .../RecipientPickerViewController.m | 1 + .../ConversationSettingsViewController.swift | 2 +- .../OWSConversationSettingsViewController.m | 2 +- .../PendingGroupMembersViewController.swift | 2 +- .../ReplaceAdminViewController.swift | 2 +- .../ShowGroupMembersViewController.m | 2 +- .../CountryCodeViewController.m | 2 +- .../ViewControllers/OWSTableViewController.h | 2 +- .../ViewControllers/OWSTableViewController.m | 23 +++++++++++++++---- 20 files changed, 38 insertions(+), 22 deletions(-) diff --git a/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m b/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m index 983e82ecc0..aef0001541 100644 --- a/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m @@ -35,7 +35,7 @@ self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self updateTableContents]; diff --git a/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m b/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m index 5dc737cad2..22359e225c 100644 --- a/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m @@ -36,7 +36,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self observeNotifications]; diff --git a/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift b/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift index 58439aa134..0d9337c305 100644 --- a/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift @@ -13,7 +13,7 @@ class AppearanceSettingsTableViewController: OWSTableViewController { view.backgroundColor = Theme.tableViewBackgroundColor tableView.backgroundColor = Theme.tableViewBackgroundColor - self.useThemeCellBackgroundColor = true + self.useThemeBackgroundColors = true updateTableContents() } diff --git a/Signal/src/ViewControllers/AppSettings/BlockListViewController.m b/Signal/src/ViewControllers/AppSettings/BlockListViewController.m index f4fdb97afb..a89e171186 100644 --- a/Signal/src/ViewControllers/AppSettings/BlockListViewController.m +++ b/Signal/src/ViewControllers/AppSettings/BlockListViewController.m @@ -53,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.useThemeCellBackgroundColor = YES; + self.tableViewController.useThemeBackgroundColors = YES; [self updateTableContents]; } diff --git a/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m b/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m index 4b3fae1a2f..eb9b3fce44 100644 --- a/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m +++ b/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m @@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.useThemeCellBackgroundColor = YES; + self.tableViewController.useThemeBackgroundColors = YES; [self createViews]; } diff --git a/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m b/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m index 7d889dc5c2..f276cca1b8 100644 --- a/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m @@ -15,7 +15,7 @@ self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self updateTableContents]; } diff --git a/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m index 317a1ced89..580104d2be 100644 --- a/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m @@ -22,7 +22,7 @@ self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self updateTableContents]; } diff --git a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m index 8560bd3611..e3b1d9e9a8 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m @@ -45,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backupStateDidChange:) diff --git a/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m index 5b381e71d9..5768cae72e 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m @@ -32,7 +32,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self setTitle:NSLocalizedString(@"SETTINGS_ITEM_NOTIFICATION_SOUND", @"Label for settings view that allows user to change the notification sound.")]; diff --git a/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m b/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m index c0254d4dde..46293786ae 100644 --- a/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; [self observeNotifications]; diff --git a/Signal/src/ViewControllers/OWS2FASettingsViewController.m b/Signal/src/ViewControllers/OWS2FASettingsViewController.m index 7854dc4343..c670c7dd22 100644 --- a/Signal/src/ViewControllers/OWS2FASettingsViewController.m +++ b/Signal/src/ViewControllers/OWS2FASettingsViewController.m @@ -35,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.useThemeCellBackgroundColor = YES; + self.tableViewController.useThemeBackgroundColors = YES; self.title = NSLocalizedString(@"ENABLE_2FA_VIEW_TITLE", @"Title for the 'enable two factor auth PIN' views."); diff --git a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m index 592d416080..37f67c6010 100644 --- a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m +++ b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m @@ -1316,6 +1316,7 @@ const NSUInteger kMinimumSearchLength = 2; OWSAssertIsOnMainThread(); self.view.backgroundColor = Theme.backgroundColor; + self.view.backgroundColor = UIColor.redColor; } @end diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift index 32032c46ab..ea4dc7fb63 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift @@ -155,7 +155,7 @@ class ConversationSettingsViewController: OWSTableViewController { view.backgroundColor = Theme.tableViewBackgroundColor tableView.backgroundColor = Theme.tableViewBackgroundColor - self.useThemeCellBackgroundColor = true + self.useThemeBackgroundColors = true tableView.estimatedRowHeight = 45 tableView.rowHeight = UITableView.automaticDimension diff --git a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m index ac3ccd0279..1c7da4a35a 100644 --- a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m @@ -251,7 +251,7 @@ const CGFloat kIconViewLength = 24; self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; self.tableView.estimatedRowHeight = 45; self.tableView.rowHeight = UITableViewAutomaticDimension; diff --git a/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift b/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift index ca968534fb..f30af253a9 100644 --- a/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift @@ -54,7 +54,7 @@ public class PendingGroupMembersViewController: OWSTableViewController { view.backgroundColor = Theme.tableViewBackgroundColor tableView.backgroundColor = Theme.tableViewBackgroundColor - self.useThemeCellBackgroundColor = true + self.useThemeBackgroundColors = true updateTableContents() } diff --git a/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift index 5574c53712..c7c5000c58 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift @@ -51,7 +51,7 @@ class ReplaceAdminViewController: OWSTableViewController { view.backgroundColor = Theme.tableViewBackgroundColor tableView.backgroundColor = Theme.tableViewBackgroundColor tableView.separatorColor = .clear - self.useThemeCellBackgroundColor = true + self.useThemeBackgroundColors = true updateTableContents() } diff --git a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m index 420f45de73..4e6b3b9e4d 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m @@ -97,7 +97,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 45; diff --git a/SignalMessaging/ViewControllers/CountryCodeViewController.m b/SignalMessaging/ViewControllers/CountryCodeViewController.m index 84d875553b..140a1f3808 100644 --- a/SignalMessaging/ViewControllers/CountryCodeViewController.m +++ b/SignalMessaging/ViewControllers/CountryCodeViewController.m @@ -34,7 +34,7 @@ NS_ASSUME_NONNULL_BEGIN self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; - self.useThemeCellBackgroundColor = YES; + self.useThemeBackgroundColors = YES; self.title = NSLocalizedString(@"COUNTRYCODE_SELECT_TITLE", @""); self.countryCodes = [PhoneNumberUtil countryCodesForSearchTerm:nil]; diff --git a/SignalMessaging/ViewControllers/OWSTableViewController.h b/SignalMessaging/ViewControllers/OWSTableViewController.h index d1c5167952..6b69c18bd2 100644 --- a/SignalMessaging/ViewControllers/OWSTableViewController.h +++ b/SignalMessaging/ViewControllers/OWSTableViewController.h @@ -171,7 +171,7 @@ typedef BOOL (^OWSTableSwitchBlock)(void); @property (nonatomic) UITableViewStyle tableViewStyle; -@property (nonatomic) BOOL useThemeCellBackgroundColor; +@property (nonatomic) BOOL useThemeBackgroundColors; - (instancetype)init NS_DESIGNATED_INITIALIZER; diff --git a/SignalMessaging/ViewControllers/OWSTableViewController.m b/SignalMessaging/ViewControllers/OWSTableViewController.m index 3bc8fc02bc..59d4a80709 100644 --- a/SignalMessaging/ViewControllers/OWSTableViewController.m +++ b/SignalMessaging/ViewControllers/OWSTableViewController.m @@ -636,7 +636,7 @@ NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier"; UITableViewCell *_Nullable customCell = [item customCell]; if (customCell != nil) { - if (self.useThemeCellBackgroundColor) { + if (self.useThemeBackgroundColors) { customCell.backgroundColor = Theme.tableCellBackgroundColor; } return customCell; @@ -648,7 +648,7 @@ NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier"; cell.textLabel.text = item.title; - if (self.useThemeCellBackgroundColor) { + if (self.useThemeBackgroundColors) { customCell.backgroundColor = Theme.tableCellBackgroundColor; } @@ -674,6 +674,7 @@ NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier"; UITextView *textView = [LinkingTextView new]; textView.textColor = Theme.secondaryTextAndIconColor; textView.font = UIFont.ows_dynamicTypeCaption1Font; + textView.backgroundColor = self.sectionHeaderAndFooterBackgroundColor; CGFloat tableEdgeInsets = UIDevice.currentDevice.isPlusSizePhone ? 20 : 16; textView.textContainerInset = UIEdgeInsetsMake(16, tableEdgeInsets, 6, tableEdgeInsets); @@ -700,6 +701,7 @@ NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier"; UITextView *textView = [LinkingTextView new]; textView.textColor = UIColor.ows_gray45Color; textView.font = UIFont.ows_dynamicTypeCaption1Font; + textView.backgroundColor = self.sectionHeaderAndFooterBackgroundColor; CGFloat tableEdgeInsets = UIDevice.currentDevice.isPlusSizePhone ? 20 : 16; textView.textContainerInset = UIEdgeInsetsMake(6, tableEdgeInsets, 12, tableEdgeInsets); @@ -851,15 +853,28 @@ NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier"; [self.tableView reloadData]; } +- (void)setUseThemeBackgroundColors:(BOOL)useThemeBackgroundColors +{ + _useThemeBackgroundColors = useThemeBackgroundColors; + + [self applyTheme]; +} + - (void)applyTheme { OWSAssertIsOnMainThread(); - self.view.backgroundColor = Theme.backgroundColor; - self.tableView.backgroundColor = Theme.backgroundColor; + UIColor *backgroundColor = (self.useThemeBackgroundColors ? Theme.tableViewBackgroundColor : Theme.backgroundColor); + self.view.backgroundColor = backgroundColor; + self.tableView.backgroundColor = backgroundColor; self.tableView.separatorColor = Theme.cellSeparatorColor; } +- (nullable UIColor *)sectionHeaderAndFooterBackgroundColor +{ + return (self.useThemeBackgroundColors ? Theme.tableViewBackgroundColor : Theme.secondaryBackgroundColor); +} + @end NS_ASSUME_NONNULL_END From c67cf3f025fe6fccbfbdbc8fbbb10ebd128084ad Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 20 Apr 2020 16:56:32 -0300 Subject: [PATCH 02/14] Revise table section header and footer backgrounds. --- .../ViewControllers/AppSettings/AboutTableViewController.m | 2 -- .../AppSettings/AdvancedSettingsTableViewController.m | 2 -- .../AppSettings/AppearanceSettingsTableViewController.swift | 2 -- .../src/ViewControllers/AppSettings/BlockListViewController.m | 1 - .../AppSettings/DomainFrontingCountryViewController.m | 1 - .../AppSettings/NotificationSettingsOptionsViewController.m | 2 -- .../AppSettings/NotificationSettingsViewController.m | 2 -- .../AppSettings/OWSBackupSettingsViewController.m | 2 -- .../AppSettings/OWSLinkedDevicesTableViewController.m | 1 + .../AppSettings/OWSSoundSettingsViewController.m | 2 -- .../AppSettings/PrivacySettingsTableViewController.m | 2 -- Signal/src/ViewControllers/OWS2FASettingsViewController.m | 1 - .../ThreadSettings/ConversationSettingsViewController.swift | 2 -- .../ThreadSettings/OWSConversationSettingsViewController.m | 2 -- .../ThreadSettings/PendingGroupMembersViewController.swift | 2 -- .../ThreadSettings/ReplaceAdminViewController.swift | 4 +--- .../ThreadSettings/ShowGroupMembersViewController.m | 2 -- SignalMessaging/ViewControllers/CountryCodeViewController.m | 2 -- 18 files changed, 2 insertions(+), 32 deletions(-) diff --git a/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m b/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m index aef0001541..96eefb2b93 100644 --- a/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/AboutTableViewController.m @@ -33,8 +33,6 @@ self.title = NSLocalizedString(@"SETTINGS_ABOUT", @"Navbar title"); - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self updateTableContents]; diff --git a/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m b/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m index 22359e225c..c554d795d2 100644 --- a/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/AdvancedSettingsTableViewController.m @@ -34,8 +34,6 @@ NS_ASSUME_NONNULL_BEGIN self.title = NSLocalizedString(@"SETTINGS_ADVANCED_TITLE", @""); - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self observeNotifications]; diff --git a/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift b/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift index 0d9337c305..f43ae0a0a5 100644 --- a/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/AppearanceSettingsTableViewController.swift @@ -11,8 +11,6 @@ class AppearanceSettingsTableViewController: OWSTableViewController { title = NSLocalizedString("SETTINGS_APPEARANCE_TITLE", comment: "The title for the appearance settings.") - view.backgroundColor = Theme.tableViewBackgroundColor - tableView.backgroundColor = Theme.tableViewBackgroundColor self.useThemeBackgroundColors = true updateTableContents() diff --git a/Signal/src/ViewControllers/AppSettings/BlockListViewController.m b/Signal/src/ViewControllers/AppSettings/BlockListViewController.m index a89e171186..6d6bd2ab3a 100644 --- a/Signal/src/ViewControllers/AppSettings/BlockListViewController.m +++ b/Signal/src/ViewControllers/AppSettings/BlockListViewController.m @@ -52,7 +52,6 @@ NS_ASSUME_NONNULL_BEGIN self.tableViewController.tableView.estimatedRowHeight = 60; self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.useThemeBackgroundColors = YES; [self updateTableContents]; diff --git a/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m b/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m index eb9b3fce44..00ded74f97 100644 --- a/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m +++ b/Signal/src/ViewControllers/AppSettings/DomainFrontingCountryViewController.m @@ -32,7 +32,6 @@ NS_ASSUME_NONNULL_BEGIN @"CENSORSHIP_CIRCUMVENTION_COUNTRY_VIEW_TITLE", @"Title for the 'censorship circumvention country' view."); self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.useThemeBackgroundColors = YES; [self createViews]; diff --git a/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m b/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m index f276cca1b8..97262f4de2 100644 --- a/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/NotificationSettingsOptionsViewController.m @@ -13,8 +13,6 @@ { [super viewDidLoad]; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self updateTableContents]; diff --git a/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m index 580104d2be..dbddf48ce5 100644 --- a/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/NotificationSettingsViewController.m @@ -20,8 +20,6 @@ [self setTitle:NSLocalizedString(@"SETTINGS_NOTIFICATIONS", nil)]; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self updateTableContents]; diff --git a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m index e3b1d9e9a8..77780bd2b2 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSBackupSettingsViewController.m @@ -43,8 +43,6 @@ NS_ASSUME_NONNULL_BEGIN self.title = NSLocalizedString(@"SETTINGS_BACKUP", @"Label for the backup view in app settings."); - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [[NSNotificationCenter defaultCenter] addObserver:self diff --git a/Signal/src/ViewControllers/AppSettings/OWSLinkedDevicesTableViewController.m b/Signal/src/ViewControllers/AppSettings/OWSLinkedDevicesTableViewController.m index 712c82241f..d53fa67c87 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSLinkedDevicesTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSLinkedDevicesTableViewController.m @@ -53,6 +53,7 @@ int const OWSLinkedDevicesTableViewControllerSectionAddDevice = 1; self.view.backgroundColor = Theme.tableViewBackgroundColor; self.tableView.backgroundColor = Theme.tableViewBackgroundColor; + self.tableView.separatorColor = Theme.cellSeparatorColor; self.isExpectingMoreDevices = NO; self.tableView.rowHeight = UITableViewAutomaticDimension; diff --git a/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m b/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m index 5768cae72e..b71bfdfcb7 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSSoundSettingsViewController.m @@ -30,8 +30,6 @@ NS_ASSUME_NONNULL_BEGIN { [super viewDidLoad]; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self setTitle:NSLocalizedString(@"SETTINGS_ITEM_NOTIFICATION_SOUND", diff --git a/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m b/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m index 46293786ae..a01f8d9482 100644 --- a/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m +++ b/Signal/src/ViewControllers/AppSettings/PrivacySettingsTableViewController.m @@ -27,8 +27,6 @@ NS_ASSUME_NONNULL_BEGIN self.title = NSLocalizedString(@"SETTINGS_PRIVACY_TITLE", @""); - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; [self observeNotifications]; diff --git a/Signal/src/ViewControllers/OWS2FASettingsViewController.m b/Signal/src/ViewControllers/OWS2FASettingsViewController.m index c670c7dd22..796b3ef683 100644 --- a/Signal/src/ViewControllers/OWS2FASettingsViewController.m +++ b/Signal/src/ViewControllers/OWS2FASettingsViewController.m @@ -34,7 +34,6 @@ NS_ASSUME_NONNULL_BEGIN [super viewDidLoad]; self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableViewController.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.tableViewController.useThemeBackgroundColors = YES; self.title = NSLocalizedString(@"ENABLE_2FA_VIEW_TITLE", @"Title for the 'enable two factor auth PIN' views."); diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift index ea4dc7fb63..8b3d640be7 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift @@ -153,8 +153,6 @@ class ConversationSettingsViewController: OWSTableViewController { "CONVERSATION_SETTINGS_CONTACT_INFO_TITLE", comment: "Navbar title when viewing settings for a 1-on-1 thread") } - view.backgroundColor = Theme.tableViewBackgroundColor - tableView.backgroundColor = Theme.tableViewBackgroundColor self.useThemeBackgroundColors = true tableView.estimatedRowHeight = 45 tableView.rowHeight = UITableView.automaticDimension diff --git a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m index 1c7da4a35a..c9e80b6c0b 100644 --- a/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/OWSConversationSettingsViewController.m @@ -249,8 +249,6 @@ const CGFloat kIconViewLength = 24; { [super viewDidLoad]; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; self.tableView.estimatedRowHeight = 45; self.tableView.rowHeight = UITableViewAutomaticDimension; diff --git a/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift b/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift index f30af253a9..c5d270b791 100644 --- a/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/PendingGroupMembersViewController.swift @@ -52,8 +52,6 @@ public class PendingGroupMembersViewController: OWSTableViewController { title = NSLocalizedString("PENDING_GROUP_MEMBERS_VIEW_TITLE", comment: "The title for the 'pending group members' view.") - view.backgroundColor = Theme.tableViewBackgroundColor - tableView.backgroundColor = Theme.tableViewBackgroundColor self.useThemeBackgroundColors = true updateTableContents() diff --git a/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift index c7c5000c58..1f4356a5c9 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ReplaceAdminViewController.swift @@ -48,10 +48,8 @@ class ReplaceAdminViewController: OWSTableViewController { title = NSLocalizedString("REPLACE_ADMIN_VIEW_TITLE", comment: "The title for the 'replace group admin' view.") - view.backgroundColor = Theme.tableViewBackgroundColor - tableView.backgroundColor = Theme.tableViewBackgroundColor - tableView.separatorColor = .clear self.useThemeBackgroundColors = true + tableView.separatorColor = .clear updateTableContents() } diff --git a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m index 4e6b3b9e4d..86878e4836 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m +++ b/Signal/src/ViewControllers/ThreadSettings/ShowGroupMembersViewController.m @@ -95,8 +95,6 @@ NS_ASSUME_NONNULL_BEGIN self.title = _thread.groupModel.groupName; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; self.tableView.rowHeight = UITableViewAutomaticDimension; diff --git a/SignalMessaging/ViewControllers/CountryCodeViewController.m b/SignalMessaging/ViewControllers/CountryCodeViewController.m index 140a1f3808..f0cc0cc6ef 100644 --- a/SignalMessaging/ViewControllers/CountryCodeViewController.m +++ b/SignalMessaging/ViewControllers/CountryCodeViewController.m @@ -32,8 +32,6 @@ NS_ASSUME_NONNULL_BEGIN self.shouldUseTheme = NO; self.interfaceOrientationMask = UIDevice.currentDevice.defaultSupportedOrienations; - self.view.backgroundColor = Theme.tableViewBackgroundColor; - self.tableView.backgroundColor = Theme.tableViewBackgroundColor; self.useThemeBackgroundColors = YES; self.title = NSLocalizedString(@"COUNTRYCODE_SELECT_TITLE", @""); From 59df20dfd5174b5abee86184b82260232aef4fc2 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 20 Apr 2020 17:36:36 -0300 Subject: [PATCH 03/14] Fix group icon resolution. --- .../group-outline-256.imageset/Contents.json | 21 +++ .../group-outline-256.pdf | 135 ++++++++++++++++++ SignalMessaging/utils/OWSGroupAvatarBuilder.m | 9 +- 3 files changed, 161 insertions(+), 4 deletions(-) create mode 100644 Signal/Images.xcassets/group-outline-256.imageset/Contents.json create mode 100644 Signal/Images.xcassets/group-outline-256.imageset/group-outline-256.pdf diff --git a/Signal/Images.xcassets/group-outline-256.imageset/Contents.json b/Signal/Images.xcassets/group-outline-256.imageset/Contents.json new file mode 100644 index 0000000000..4301edb5f4 --- /dev/null +++ b/Signal/Images.xcassets/group-outline-256.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "group-outline-256.pdf", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/group-outline-256.imageset/group-outline-256.pdf b/Signal/Images.xcassets/group-outline-256.imageset/group-outline-256.pdf new file mode 100644 index 0000000000..d6fa529d32 --- /dev/null +++ b/Signal/Images.xcassets/group-outline-256.imageset/group-outline-256.pdf @@ -0,0 +1,135 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 19.200195 38.400635 cm +0.000000 0.000000 0.000000 scn +166.400009 110.399994 m +177.428848 110.386444 188.002106 105.999245 195.800690 98.200661 c +203.599258 90.402084 207.986450 79.828842 208.000000 68.799995 c +208.000000 64.000000 l +217.600006 64.000000 l +217.600006 68.799995 l +217.586868 80.927238 213.269485 92.656120 205.416824 101.897652 c +197.564163 111.139183 186.686066 117.293320 174.720001 119.263992 c +181.056274 124.853577 185.540268 132.240097 187.575348 140.440735 c +189.610413 148.641357 189.100098 157.267273 186.112259 165.170731 c +183.124420 173.074188 177.800751 179.880463 170.849594 184.683929 c +163.898422 189.487396 155.649368 192.060303 147.199997 192.060303 c +138.750626 192.060303 130.501572 189.487396 123.550415 184.683929 c +116.599258 179.880463 111.275581 173.074188 108.287743 165.170731 c +105.299911 157.267273 104.789589 148.641357 106.824661 140.440735 c +108.859734 132.240097 113.343727 124.853577 119.680008 119.263992 c +113.566147 118.267235 107.686012 116.161140 102.329605 113.049591 c +98.677528 117.500450 94.141319 121.144775 89.008049 123.751945 c +83.874771 126.359116 78.256203 127.872360 72.507889 128.195923 c +66.759575 128.519470 61.006672 127.646294 55.613251 125.631638 c +50.219830 123.616989 45.303318 120.504730 41.174843 116.491814 c +37.046368 112.478897 33.795822 107.652687 31.628906 102.318619 c +29.461992 96.984550 28.425892 91.258759 28.586170 85.503578 c +28.746449 79.748390 30.099613 74.089134 32.560040 68.883934 c +35.020466 63.678726 38.534580 59.040924 42.880001 55.263992 c +30.913935 53.293335 20.035849 47.139191 12.183185 37.897659 c +4.330521 28.656128 0.013142 16.927246 0.000000 4.800003 c +0.000000 0.000000 l +9.600000 0.000000 l +9.600000 4.800003 l +9.613549 15.828842 14.000745 26.402084 21.799322 34.200668 c +29.597900 41.999252 40.171154 46.386444 51.200001 46.399994 c +89.599998 46.399994 l +100.628845 46.386444 111.202095 41.999252 119.000671 34.200668 c +126.799248 26.402084 131.186447 15.828842 131.199997 4.800003 c +131.199997 0.000000 l +140.800003 0.000000 l +140.800003 4.800003 l +140.786865 16.927246 136.469482 28.656128 128.616821 37.897659 c +120.764160 47.139191 109.886063 53.293335 97.919998 55.263992 c +104.809738 61.314346 109.495682 69.481003 111.242432 78.482346 c +112.989189 87.483688 111.697899 96.810249 107.571205 104.998390 c +113.797165 108.540016 120.837204 110.401474 128.000000 110.399994 c +166.400009 110.399994 l +h +70.400002 54.399994 m +64.070999 54.399994 57.884129 56.276764 52.621754 59.792969 c +47.359379 63.309174 43.257858 68.306892 40.835854 74.154121 c +38.413849 80.001358 37.780140 86.435493 39.014870 92.642891 c +40.249596 98.850281 43.297302 104.552132 47.772583 109.027412 c +52.247864 113.502693 57.949718 116.550400 64.157112 117.785126 c +70.364502 119.019852 76.798630 118.386147 82.645866 115.964142 c +88.493103 113.542137 93.490829 109.440613 97.007034 104.178238 c +100.523239 98.915863 102.400002 92.729004 102.400002 86.400002 c +102.400002 77.913071 99.028580 69.773743 93.027420 63.772583 c +87.026253 57.771423 78.886932 54.399994 70.400002 54.399994 c +70.400002 54.399994 l +h +115.200005 150.399994 m +115.200005 156.729004 117.076767 162.915863 120.592972 168.178238 c +124.109177 173.440613 129.106888 177.542130 134.954132 179.964142 c +140.801361 182.386139 147.235504 183.019852 153.442902 181.785126 c +159.650284 180.550400 165.352142 177.502686 169.827423 173.027405 c +174.302704 168.552124 177.350403 162.850281 178.585129 156.642883 c +179.819855 150.435486 179.186157 144.001358 176.764145 138.154129 c +174.342148 132.306885 170.240616 127.309174 164.978256 123.792969 c +159.715881 120.276764 153.529007 118.399994 147.199997 118.399994 c +138.713074 118.399994 130.573746 121.771408 124.572586 127.772575 c +118.571419 133.773743 115.200005 141.913071 115.200005 150.399994 c +h +f +n +Q + +endstream +endobj + +3 0 obj + 3870 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 256.000000 256.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000003960 00000 n +0000003983 00000 n +0000004158 00000 n +0000004232 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +4291 +%%EOF \ No newline at end of file diff --git a/SignalMessaging/utils/OWSGroupAvatarBuilder.m b/SignalMessaging/utils/OWSGroupAvatarBuilder.m index be6733b2bc..bad8a14638 100644 --- a/SignalMessaging/utils/OWSGroupAvatarBuilder.m +++ b/SignalMessaging/utils/OWSGroupAvatarBuilder.m @@ -1,5 +1,5 @@ // -// Copyright (c) 2019 Open Whisper Systems. All rights reserved. +// Copyright (c) 2020 Open Whisper Systems. All rights reserved. // #import "OWSGroupAvatarBuilder.h" @@ -58,7 +58,8 @@ NS_ASSUME_NONNULL_BEGIN conversationColorName:(NSString *)conversationColorName diameter:(NSUInteger)diameter { - NSString *cacheKey = [NSString stringWithFormat:@"%@-%d", groupId.hexadecimalString, Theme.isDarkThemeEnabled]; + NSString *cacheKey = [NSString + stringWithFormat:@"%@-%d-%lu", groupId.hexadecimalString, Theme.isDarkThemeEnabled, (unsigned long)diameter]; UIImage *_Nullable cachedAvatar = [OWSGroupAvatarBuilder.contactsManager.avatarCache imageForKey:cacheKey diameter:(CGFloat)diameter]; @@ -85,9 +86,9 @@ NS_ASSUME_NONNULL_BEGIN + (nullable UIImage *)groupAvatarImageWithBackgroundColor:(UIColor *)backgroundColor diameter:(NSUInteger)diameter { - UIImage *icon = [UIImage imageNamed:@"group-outline-40"]; + UIImage *icon = [UIImage imageNamed:@"group-outline-256"]; // Adjust asset size to reflect the output diameter. - CGFloat scaling = diameter / (CGFloat)52; + CGFloat scaling = diameter * 0.003f; CGSize iconSize = CGSizeScale(icon.size, scaling); return [OWSAvatarBuilder avatarImageWithIcon:icon iconSize:iconSize From 0666e805511edef33b48482989e10aaacc5eaa6c Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 20 Apr 2020 17:37:20 -0300 Subject: [PATCH 04/14] Disable selection of "you" member in conversation settings. --- .../ConversationSettingsViewController+Contents.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift index df8e15c025..c79499268c 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift @@ -660,13 +660,13 @@ extension ConversationSettingsViewController { continue } + let isLocalUser = memberAddress == localAddress section.add(OWSTableItem(customCellBlock: { [weak self] in guard let self = self else { owsFailDebug("Missing self") return OWSTableItem.newCell() } let cell = ContactTableViewCell() - let isLocalUser = memberAddress == localAddress let isGroupAdmin = groupMembership.isAdministrator(memberAddress) let isVerified = verificationState == .verified let isNoLongerVerified = verificationState == .noLongerVerified @@ -711,6 +711,9 @@ extension ConversationSettingsViewController { return cell }, customRowHeight: UITableView.automaticDimension) { [weak self] in + guard !isLocalUser else { + return + } self?.didSelectGroupMember(memberAddress) }) } From ec7ef21bc76bc238e56f28c17f821acad2344f5c Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 09:11:44 -0300 Subject: [PATCH 05/14] Design changes for groups v2 UI. --- .../group-outline-20.imageset/Contents.json | 21 ++++++++++++++++++ .../group-outline-20.pdf | Bin 0 -> 43132 bytes ...ationSettingsViewController+Contents.swift | 13 +++++------ SignalMessaging/appearance/Theme+OWS.swift | 2 +- 4 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 Signal/Images.xcassets/group-outline-20.imageset/Contents.json create mode 100644 Signal/Images.xcassets/group-outline-20.imageset/group-outline-20.pdf diff --git a/Signal/Images.xcassets/group-outline-20.imageset/Contents.json b/Signal/Images.xcassets/group-outline-20.imageset/Contents.json new file mode 100644 index 0000000000..cdd6a8d24c --- /dev/null +++ b/Signal/Images.xcassets/group-outline-20.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "group-outline-20.pdf", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/group-outline-20.imageset/group-outline-20.pdf b/Signal/Images.xcassets/group-outline-20.imageset/group-outline-20.pdf new file mode 100644 index 0000000000000000000000000000000000000000..09b5e4a4e205dff951e827f448354e1a40f1de5e GIT binary patch literal 43132 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 Date: Tue, 21 Apr 2020 09:12:00 -0300 Subject: [PATCH 06/14] Change sorting of group members in conversation settings view. --- SignalMessaging/contacts/OWSContactsManager.m | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/SignalMessaging/contacts/OWSContactsManager.m b/SignalMessaging/contacts/OWSContactsManager.m index 3d7f2f4058..009f00d928 100644 --- a/SignalMessaging/contacts/OWSContactsManager.m +++ b/SignalMessaging/contacts/OWSContactsManager.m @@ -1265,10 +1265,28 @@ NSString *const OWSContactsManagerKeyNextFullIntersectionDate = @"OWSContactsMan - (NSComparisonResult (^)(SignalServiceAddress *left, SignalServiceAddress *right))signalServiceAddressComparatorWithTransaction:(SDSAnyReadTransaction *)transaction { + // We want to sort phone numbers _after_ names. + NSCharacterSet *numericSet = [NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]; + BOOL (^hasNumericPrefix)(NSString *) = ^(NSString *string) { + if (string.length < 1) { + return NO; + } + unichar firstChar = [string characterAtIndex:0]; + return [numericSet characterIsMember:firstChar]; + }; + return ^NSComparisonResult(SignalServiceAddress *left, SignalServiceAddress *right) { NSString *leftName = [self comparableNameForAddress:left transaction:transaction]; NSString *rightName = [self comparableNameForAddress:right transaction:transaction]; + BOOL leftHasNumericPrefix = hasNumericPrefix(leftName); + BOOL rightHasNumericPrefix = hasNumericPrefix(rightName); + if (leftHasNumericPrefix && !rightHasNumericPrefix) { + return NSOrderedDescending; + } else if (!leftHasNumericPrefix && rightHasNumericPrefix) { + return NSOrderedAscending; + } + NSComparisonResult nameComparison = [leftName caseInsensitiveCompare:rightName]; if (nameComparison == NSOrderedSame) { return [left.stringForDisplay compare:right.stringForDisplay]; From 7693545789d9743508ae6c3243c05f77620b3049 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 09:38:20 -0300 Subject: [PATCH 07/14] Improve handling of v1 groups in v2 groups UI. --- .../NewGroupView/BaseGroupMemberViewController.swift | 12 ++++++++++++ .../NewGroupView/NewGroupMembersViewController.swift | 4 ++++ .../AddGroupMembersViewController.swift | 7 +++++++ 3 files changed, 23 insertions(+) diff --git a/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift b/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift index da93a17328..ffb6ef2dfa 100644 --- a/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift +++ b/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift @@ -11,6 +11,8 @@ protocol GroupMemberViewDelegate: class { var groupMemberViewHasUnsavedChanges: Bool { get } + var shouldTryToEnableGroupsV2ForMembers: Bool { get } + func groupMemberViewRemoveRecipient(_ recipient: PickedRecipient) func groupMemberViewAddRecipient(_ recipient: PickedRecipient) @@ -415,10 +417,17 @@ extension BaseGroupMemberViewController: RecipientPickerDelegate { owsFailDebug("Invalid recipient.") return } + guard let groupMemberViewDelegate = groupMemberViewDelegate else { + owsFailDebug("Missing delegate.") + return + } guard RemoteConfig.groupsV2CreateGroups || RemoteConfig.groupsV2IncomingMessages else { return } + guard groupMemberViewDelegate.shouldTryToEnableGroupsV2ForMembers else { + return + } DispatchQueue.global().async { if !self.doesRecipientSupportGroupsV2(recipient) { self.tryToEnableGroupsV2ForAddress(address, @@ -442,6 +451,9 @@ extension BaseGroupMemberViewController: RecipientPickerDelegate { RemoteConfig.groupsV2IncomingMessages else { return AnyPromise(Promise.value(())) } + guard groupMemberViewDelegate.shouldTryToEnableGroupsV2ForMembers else { + return AnyPromise(Promise.value(())) + } guard !doesRecipientSupportGroupsV2(recipient) else { // Recipient already supports groups v2. return AnyPromise(Promise.value(())) diff --git a/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift b/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift index 9db37110e1..e298d904dc 100644 --- a/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift @@ -59,6 +59,10 @@ extension NewGroupMembersViewController: GroupMemberViewDelegate { return newGroupState.hasUnsavedChanges } + var shouldTryToEnableGroupsV2ForMembers: Bool { + return true + } + func groupMemberViewRemoveRecipient(_ recipient: PickedRecipient) { newGroupState.recipientSet.remove(recipient) } diff --git a/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift b/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift index 54cc903667..b67181daf7 100644 --- a/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift @@ -211,6 +211,10 @@ extension AddGroupMembersViewController: GroupMemberViewDelegate { return !newRecipientSet.isEmpty } + var shouldTryToEnableGroupsV2ForMembers: Bool { + return groupThread.isGroupV2Thread + } + func groupMemberViewRemoveRecipient(_ recipient: PickedRecipient) { newRecipientSet.remove(recipient) updateNavbar() @@ -222,6 +226,9 @@ extension AddGroupMembersViewController: GroupMemberViewDelegate { } func groupMemberViewCanAddRecipient(_ recipient: PickedRecipient) -> Bool { + guard groupThread.isGroupV2Thread else { + return true + } guard let address = recipient.address else { owsFailDebug("Invalid recipient.") return false From 8bad56a9cc340af45442a3fead7bfba467a4355e Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 10:18:30 -0300 Subject: [PATCH 08/14] Clean up ahead of PR. --- .../RecipientPicker/RecipientPickerViewController.m | 1 - 1 file changed, 1 deletion(-) diff --git a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m index 37f67c6010..592d416080 100644 --- a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m +++ b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m @@ -1316,7 +1316,6 @@ const NSUInteger kMinimumSearchLength = 2; OWSAssertIsOnMainThread(); self.view.backgroundColor = Theme.backgroundColor; - self.view.backgroundColor = UIColor.redColor; } @end From f432a0f555f2ebf4b6d3c5b8b0ccb3b9a57787ca Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 10:47:44 -0300 Subject: [PATCH 09/14] Remove cell separators in recipient pickers. --- .../RecipientPicker/RecipientPickerViewController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m index 592d416080..1c0788ba48 100644 --- a/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m +++ b/Signal/src/ViewControllers/RecipientPicker/RecipientPickerViewController.m @@ -153,7 +153,9 @@ const NSUInteger kMinimumSearchLength = 2; // 2. the scrollable view (tableView in this case) must be at index 0. [self addChildViewController:self.tableViewController]; [self.view insertSubview:self.tableViewController.view atIndex:0]; - + // separatorStyle must be set _after_ the table view is added to the view hierarchy. + self.tableViewController.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + [self.tableViewController.view autoPinEdgesToSuperviewEdges]; self.tableViewController.tableView.rowHeight = UITableViewAutomaticDimension; From 8f66b175c60698c92288aa0cde2dd248f3419af4 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 12:21:01 -0300 Subject: [PATCH 10/14] Tweak avatar sizes again. --- ...ationSettingsViewController+Contents.swift | 9 ++++-- .../OWSTableViewController.swift | 32 ++++++++++++++++--- SignalMessaging/Views/ContactCellView.h | 2 ++ SignalMessaging/Views/ContactCellView.m | 18 ++++++++--- SignalMessaging/Views/ContactTableViewCell.h | 2 ++ SignalMessaging/Views/ContactTableViewCell.m | 5 +++ SignalMessaging/utils/OWSAvatarBuilder.h | 1 + SignalMessaging/utils/OWSAvatarBuilder.m | 3 +- SignalServiceKit/src/Util/FeatureFlags.swift | 2 +- 9 files changed, 60 insertions(+), 14 deletions(-) diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift index 901b5afb96..82de6208fe 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController+Contents.swift @@ -589,7 +589,7 @@ extension ConversationSettingsViewController { cell.preservesSuperviewLayoutMargins = true cell.contentView.preservesSuperviewLayoutMargins = true - let iconView = OWSTableItem.buildIconInCircleView(icon: .settingsAddMembers, innerIconSize: 24) + let iconView = OWSTableItem.buildIconInCircleView(icon: .settingsAddMembers, iconSize: kSmallAvatarSize) let rowLabel = UILabel() rowLabel.text = NSLocalizedString("CONVERSATION_SETTINGS_ADD_MEMBERS", @@ -667,6 +667,8 @@ extension ConversationSettingsViewController { return OWSTableItem.newCell() } let cell = ContactTableViewCell() + cell.setUseSmallAvatars() + let isGroupAdmin = groupMembership.isAdministrator(memberAddress) let isVerified = verificationState == .verified let isNoLongerVerified = verificationState == .noLongerVerified @@ -683,7 +685,7 @@ extension ConversationSettingsViewController { if isLocalUser { // Use a custom avatar to avoid using the "note to self" icon. - let customAvatar = OWSProfileManager.shared().localProfileAvatarImage() ?? OWSContactAvatarBuilder(forLocalUserWithDiameter: kStandardAvatarSize).buildDefaultImage() + let customAvatar = OWSProfileManager.shared().localProfileAvatarImage() ?? OWSContactAvatarBuilder(forLocalUserWithDiameter: kSmallAvatarSize).buildDefaultImage() cell.setCustomAvatar(customAvatar) cell.setCustomName(NSLocalizedString("GROUP_MEMBER_LOCAL_USER", comment: "Label indicating the local user.")) @@ -726,7 +728,8 @@ extension ConversationSettingsViewController { cell.contentView.preservesSuperviewLayoutMargins = true let iconView = OWSTableItem.buildIconInCircleView(icon: .settingsShowAllMembers, - innerIconSize: 24, + iconSize: kSmallAvatarSize, + innerIconSize: 12, iconTintColor: Theme.secondaryTextAndIconColor) let rowLabel = UILabel() diff --git a/SignalMessaging/ViewControllers/OWSTableViewController.swift b/SignalMessaging/ViewControllers/OWSTableViewController.swift index a8cbd69aac..75b6d7ec23 100644 --- a/SignalMessaging/ViewControllers/OWSTableViewController.swift +++ b/SignalMessaging/ViewControllers/OWSTableViewController.swift @@ -149,15 +149,37 @@ public extension OWSTableItem { } static func buildIconInCircleView(icon: ThemeIcon, - innerIconSize: CGFloat = 24) -> UIView { + innerIconSize: CGFloat) -> UIView { return buildIconInCircleView(icon: icon, + iconSize: nil, innerIconSize: innerIconSize, - iconTintColor: .ows_accentBlue) + iconTintColor: nil) } static func buildIconInCircleView(icon: ThemeIcon, - innerIconSize: CGFloat = 24, + innerIconSize: CGFloat, + iconTintColor: UIColor) -> UIView { + return buildIconInCircleView(icon: icon, + iconSize: nil, + innerIconSize: innerIconSize, + iconTintColor: iconTintColor) + } +} + +// MARK: - + +public extension OWSTableItem { + static func buildIconInCircleView(icon: ThemeIcon, + iconSize iconSizeParam: UInt? = nil, + innerIconSize innerIconSizeParam: CGFloat? = nil, iconTintColor: UIColor? = nil) -> UIView { + let iconSize = CGFloat(iconSizeParam ?? kStandardAvatarSize) + let innerIconSize: CGFloat + if let innerIconSizeParam = innerIconSizeParam { + innerIconSize = innerIconSizeParam + } else { + innerIconSize = CGFloat(iconSize) * 0.6 + } let iconView = OWSTableItem.imageView(forIcon: icon, iconSize: innerIconSize) if let iconTintColor = iconTintColor { iconView.tintColor = iconTintColor @@ -168,8 +190,8 @@ public extension OWSTableItem { iconWrapper.addSubview(iconView) iconView.autoCenterInSuperview() iconWrapper.backgroundColor = Theme.isDarkThemeEnabled ? UIColor.ows_gray80 : Theme.washColor - iconWrapper.layer.cornerRadius = CGFloat(kStandardAvatarSize) * 0.5 - iconWrapper.autoSetDimensions(to: CGSize(square: CGFloat(kStandardAvatarSize))) + iconWrapper.layer.cornerRadius = iconSize * 0.5 + iconWrapper.autoSetDimensions(to: CGSize(square: iconSize)) iconWrapper.setCompressionResistanceHigh() iconWrapper.setContentHuggingHigh() return iconWrapper diff --git a/SignalMessaging/Views/ContactCellView.h b/SignalMessaging/Views/ContactCellView.h index 059fa6d4af..d7affb824e 100644 --- a/SignalMessaging/Views/ContactCellView.h +++ b/SignalMessaging/Views/ContactCellView.h @@ -18,6 +18,8 @@ extern const CGFloat kContactCellAvatarTextMargin; @property (nonatomic, nullable) UIImage *customAvatar; +@property (nonatomic) BOOL useSmallAvatars; + - (void)configureWithRecipientAddress:(SignalServiceAddress *)address; - (void)configureWithThread:(TSThread *)thread transaction:(SDSAnyReadTransaction *)transaction; diff --git a/SignalMessaging/Views/ContactCellView.m b/SignalMessaging/Views/ContactCellView.m index 1fac0afba8..b4ee6717de 100644 --- a/SignalMessaging/Views/ContactCellView.m +++ b/SignalMessaging/Views/ContactCellView.m @@ -30,6 +30,7 @@ const CGFloat kContactCellAvatarTextMargin = 8; @property (nonatomic, nullable) TSThread *thread; @property (nonatomic) SignalServiceAddress *address; +@property (nonatomic, nullable) NSArray *layoutConstraints; @end @@ -80,8 +81,6 @@ const CGFloat kContactCellAvatarTextMargin = 8; self.layoutMargins = UIEdgeInsetsZero; _avatarView = [AvatarImageView new]; - [_avatarView autoSetDimension:ALDimensionWidth toSize:kStandardAvatarSize]; - [_avatarView autoSetDimension:ALDimensionHeight toSize:kStandardAvatarSize]; self.nameLabel = [UILabel new]; self.nameLabel.lineBreakMode = NSLineBreakByTruncatingTail; @@ -190,7 +189,8 @@ const CGFloat kContactCellAvatarTextMargin = 8; self.nameLabel.attributedText = attributedText; } - self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread diameter:kStandardAvatarSize]; + self.layoutConstraints = [self.avatarView autoSetDimensionsToSize:CGSizeMake(self.avatarSize, self.avatarSize)]; + self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread diameter:self.avatarSize]; if (self.accessoryMessage) { self.accessoryLabel.text = self.accessoryMessage; @@ -203,6 +203,8 @@ const CGFloat kContactCellAvatarTextMargin = 8; - (void)updateAvatar { + self.layoutConstraints = [self.avatarView autoSetDimensionsToSize:CGSizeMake(self.avatarSize, self.avatarSize)]; + if (self.customAvatar != nil) { self.avatarView.image = self.customAvatar; return; @@ -225,11 +227,16 @@ const CGFloat kContactCellAvatarTextMargin = 8; OWSContactAvatarBuilder *avatarBuilder = [[OWSContactAvatarBuilder alloc] initWithAddress:address colorName:colorName - diameter:kStandardAvatarSize]; + diameter:self.avatarSize]; self.avatarView.image = [avatarBuilder build]; } +- (NSUInteger)avatarSize +{ + return self.useSmallAvatars ? kSmallAvatarSize : kStandardAvatarSize; +} + - (void)updateNameLabels { BOOL hasCustomName = self.customName.length > 0; @@ -274,6 +281,9 @@ const CGFloat kContactCellAvatarTextMargin = 8; for (UIView *subview in self.accessoryViewContainer.subviews) { [subview removeFromSuperview]; } + [NSLayoutConstraint deactivateConstraints:self.layoutConstraints]; + self.layoutConstraints = nil; + self.useSmallAvatars = NO; } - (void)otherUsersProfileDidChange:(NSNotification *)notification diff --git a/SignalMessaging/Views/ContactTableViewCell.h b/SignalMessaging/Views/ContactTableViewCell.h index bcb73661ba..731acbcf0f 100644 --- a/SignalMessaging/Views/ContactTableViewCell.h +++ b/SignalMessaging/Views/ContactTableViewCell.h @@ -27,6 +27,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)setCustomAvatar:(nullable UIImage *)customAvatar; +- (void)setUseSmallAvatars; + - (NSAttributedString *)verifiedSubtitle; - (BOOL)hasAccessoryText; diff --git a/SignalMessaging/Views/ContactTableViewCell.m b/SignalMessaging/Views/ContactTableViewCell.m index 51cbf3704c..300f1b7c30 100644 --- a/SignalMessaging/Views/ContactTableViewCell.m +++ b/SignalMessaging/Views/ContactTableViewCell.m @@ -107,6 +107,11 @@ NS_ASSUME_NONNULL_BEGIN [self.cellView setCustomAvatar:customAvatar]; } +- (void)setUseSmallAvatars +{ + self.cellView.useSmallAvatars = YES; +} + - (void)prepareForReuse { [super prepareForReuse]; diff --git a/SignalMessaging/utils/OWSAvatarBuilder.h b/SignalMessaging/utils/OWSAvatarBuilder.h index 39c81d4458..b952e63503 100644 --- a/SignalMessaging/utils/OWSAvatarBuilder.h +++ b/SignalMessaging/utils/OWSAvatarBuilder.h @@ -4,6 +4,7 @@ NS_ASSUME_NONNULL_BEGIN +extern const NSUInteger kSmallAvatarSize; extern const NSUInteger kStandardAvatarSize; extern const NSUInteger kMediumAvatarSize; extern const NSUInteger kLargeAvatarSize; diff --git a/SignalMessaging/utils/OWSAvatarBuilder.m b/SignalMessaging/utils/OWSAvatarBuilder.m index ce65e8ded3..08f3e6f225 100644 --- a/SignalMessaging/utils/OWSAvatarBuilder.m +++ b/SignalMessaging/utils/OWSAvatarBuilder.m @@ -15,7 +15,8 @@ NS_ASSUME_NONNULL_BEGIN -const NSUInteger kStandardAvatarSize = 40; +const NSUInteger kSmallAvatarSize = 40; +const NSUInteger kStandardAvatarSize = 48; const NSUInteger kMediumAvatarSize = 68; const NSUInteger kLargeAvatarSize = 96; diff --git a/SignalServiceKit/src/Util/FeatureFlags.swift b/SignalServiceKit/src/Util/FeatureFlags.swift index d1dca2009d..244d40627b 100644 --- a/SignalServiceKit/src/Util/FeatureFlags.swift +++ b/SignalServiceKit/src/Util/FeatureFlags.swift @@ -210,7 +210,7 @@ public class FeatureFlags: NSObject { public static let linkedPhones = build.includes(.internalPreview) @objc - public static let isUsingProductionService = true + public static let isUsingProductionService = false @objc public static let versionedProfiledFetches = groupsV2 From f7af2a77770d0a09234219356cc4f804a58c4b45 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 13:46:39 -0300 Subject: [PATCH 11/14] Adjust layout of new group confirm view. --- .../NewGroupView/NewGroupConfirmViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Signal/src/ViewControllers/NewGroupView/NewGroupConfirmViewController.swift b/Signal/src/ViewControllers/NewGroupView/NewGroupConfirmViewController.swift index 4c54a82b26..07040384cf 100644 --- a/Signal/src/ViewControllers/NewGroupView/NewGroupConfirmViewController.swift +++ b/Signal/src/ViewControllers/NewGroupView/NewGroupConfirmViewController.swift @@ -97,7 +97,7 @@ public class NewGroupConfirmViewController: OWSViewController { firstSection.preservesSuperviewLayoutMargins = true view.addSubview(firstSection) firstSection.autoPinWidthToSuperview() - firstSection.autoPin(toTopLayoutGuideOf: self, withInset: 0) + firstSection.autoPin(toTopLayoutGuideOf: self, withInset: 8) addChild(recipientTableView) view.addSubview(recipientTableView.view) From 41fe5c886de9c681393db1476896e803e6365416 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 13:50:55 -0300 Subject: [PATCH 12/14] Clean up ahead of PR. --- SignalServiceKit/src/Util/FeatureFlags.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Util/FeatureFlags.swift b/SignalServiceKit/src/Util/FeatureFlags.swift index 244d40627b..d1dca2009d 100644 --- a/SignalServiceKit/src/Util/FeatureFlags.swift +++ b/SignalServiceKit/src/Util/FeatureFlags.swift @@ -210,7 +210,7 @@ public class FeatureFlags: NSObject { public static let linkedPhones = build.includes(.internalPreview) @objc - public static let isUsingProductionService = false + public static let isUsingProductionService = true @objc public static let versionedProfiledFetches = groupsV2 From 9a6ab0f888343f9211078f44f37ac58473c2bc9e Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 21 Apr 2020 13:52:48 -0300 Subject: [PATCH 13/14] Revise how member counts are presented in new "create group" flow. --- .../NewGroupView/BaseGroupMemberViewController.swift | 4 ++-- .../NewGroupView/NewGroupMembersViewController.swift | 12 ++++++++---- .../AddGroupMembersViewController.swift | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift b/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift index ffb6ef2dfa..db84bcdf13 100644 --- a/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift +++ b/Signal/src/ViewControllers/NewGroupView/BaseGroupMemberViewController.swift @@ -19,7 +19,7 @@ protocol GroupMemberViewDelegate: class { func groupMemberViewCanAddRecipient(_ recipient: PickedRecipient) -> Bool - func groupMemberViewGroupMemberCount() -> Int + func groupMemberViewGroupMemberCountForDisplay() -> Int func groupMemberViewIsGroupFull() -> Bool @@ -172,7 +172,7 @@ public class BaseGroupMemberViewController: OWSViewController { memberCountWrapper.isHidden = false let format = NSLocalizedString("GROUP_MEMBER_COUNT_FORMAT", comment: "Format string for the group member count indicator. Embeds {{ %1$@ the number of members in the group, %2$@ the maximum number of members in the group. }}.") - let memberCount = groupMemberViewDelegate?.groupMemberViewGroupMemberCount() ?? 0 + let memberCount = groupMemberViewDelegate?.groupMemberViewGroupMemberCountForDisplay() ?? 0 memberCountLabel.text = String(format: format, OWSFormat.formatInt(memberCount), diff --git a/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift b/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift index e298d904dc..b68cbdaf2e 100644 --- a/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/NewGroupView/NewGroupMembersViewController.swift @@ -79,13 +79,17 @@ extension NewGroupMembersViewController: GroupMemberViewDelegate { return true } - func groupMemberViewGroupMemberCount() -> Int { - // We add one for the local user. - return newGroupState.recipientSet.count + 1 + func groupMemberViewGroupMemberCountForDisplay() -> Int { + return groupMemberViewGroupMemberCount(withSelf: false) + } + + func groupMemberViewGroupMemberCount(withSelf: Bool) -> Int { + // We sometimes add one for the local user. + return newGroupState.recipientSet.count + (withSelf ? 1 : 0) } func groupMemberViewIsGroupFull() -> Bool { - return groupMemberViewGroupMemberCount() >= GroupManager.maxGroupMemberCount + return groupMemberViewGroupMemberCount(withSelf: true) >= GroupManager.maxGroupMemberCount } func groupMemberViewIsPreExistingMember(_ recipient: PickedRecipient) -> Bool { diff --git a/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift b/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift index b67181daf7..9994d7bfea 100644 --- a/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/AddGroupMembersViewController.swift @@ -238,7 +238,7 @@ extension AddGroupMembersViewController: GroupMemberViewDelegate { } } - func groupMemberViewGroupMemberCount() -> Int { + func groupMemberViewGroupMemberCountForDisplay() -> Int { return (oldGroupModel.groupMembership.pendingAndNonPendingMemberCount + newRecipientSet.count) } @@ -247,7 +247,7 @@ extension AddGroupMembersViewController: GroupMemberViewDelegate { guard groupThread.isGroupV2Thread else { return false } - return groupMemberViewGroupMemberCount() >= GroupManager.maxGroupMemberCount + return groupMemberViewGroupMemberCountForDisplay() >= GroupManager.maxGroupMemberCount } func groupMemberViewMaxMemberCount() -> UInt? { From d9c79b27a5208ed29a1c28d58a112cceeaf9de3f Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 22 Apr 2020 10:05:35 -0300 Subject: [PATCH 14/14] Tweak contact sorting. --- SignalMessaging/contacts/OWSContactsManager.m | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/SignalMessaging/contacts/OWSContactsManager.m b/SignalMessaging/contacts/OWSContactsManager.m index 009f00d928..e58a9bfbb9 100644 --- a/SignalMessaging/contacts/OWSContactsManager.m +++ b/SignalMessaging/contacts/OWSContactsManager.m @@ -1265,25 +1265,25 @@ NSString *const OWSContactsManagerKeyNextFullIntersectionDate = @"OWSContactsMan - (NSComparisonResult (^)(SignalServiceAddress *left, SignalServiceAddress *right))signalServiceAddressComparatorWithTransaction:(SDSAnyReadTransaction *)transaction { - // We want to sort phone numbers _after_ names. - NSCharacterSet *numericSet = [NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]; - BOOL (^hasNumericPrefix)(NSString *) = ^(NSString *string) { + // We want to sort E164 phone numbers _after_ names. + NSCharacterSet *e164PrefixSet = [NSCharacterSet characterSetWithCharactersInString:@"+"]; + BOOL (^hasE164Prefix)(NSString *) = ^(NSString *string) { if (string.length < 1) { return NO; } unichar firstChar = [string characterAtIndex:0]; - return [numericSet characterIsMember:firstChar]; + return [e164PrefixSet characterIsMember:firstChar]; }; return ^NSComparisonResult(SignalServiceAddress *left, SignalServiceAddress *right) { NSString *leftName = [self comparableNameForAddress:left transaction:transaction]; NSString *rightName = [self comparableNameForAddress:right transaction:transaction]; - BOOL leftHasNumericPrefix = hasNumericPrefix(leftName); - BOOL rightHasNumericPrefix = hasNumericPrefix(rightName); - if (leftHasNumericPrefix && !rightHasNumericPrefix) { + BOOL leftHasE164Prefix = hasE164Prefix(leftName); + BOOL rightHasE164Prefix = hasE164Prefix(rightName); + if (leftHasE164Prefix && !rightHasE164Prefix) { return NSOrderedDescending; - } else if (!leftHasNumericPrefix && rightHasNumericPrefix) { + } else if (!leftHasE164Prefix && rightHasE164Prefix) { return NSOrderedAscending; }