diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 3527c3aee..34219ae40 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -477,6 +477,10 @@ E1CD329618BCFF9900B1A496 /* SoundInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = E1CD329518BCFF9900B1A496 /* SoundInstance.m */; }; F995AC2FFD6D4442B012604A /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8313AE91B4954215858A5662 /* libPods.a */; }; FC15B7BF1A1F80F200F59801 /* defaultConctact_light@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7BE1A1F80F200F59801 /* defaultConctact_light@2x.png */; }; + FC1615181A37935600F1761D /* NotificationPreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC1615171A37935600F1761D /* NotificationPreviewViewController.m */; }; + FC16151C1A37945D00F1761D /* notification_no_preview_with_name@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC1615191A37945D00F1761D /* notification_no_preview_with_name@2x.png */; }; + FC16151D1A37945D00F1761D /* notification_no_preview_no_name@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC16151A1A37945D00F1761D /* notification_no_preview_no_name@2x.png */; }; + FC16151E1A37945D00F1761D /* notification_with_preview@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC16151B1A37945D00F1761D /* notification_with_preview@2x.png */; }; FC18803C1A31D94D0044CE86 /* SignalTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = FC18803B1A31D94D0044CE86 /* SignalTabBarController.m */; }; FC1F90C01A22342B004F8253 /* group_photo@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC1F90BF1A22342B004F8253 /* group_photo@2x.png */; }; FC1F90C61A223991004F8253 /* settings_tab@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FC1F90C41A223991004F8253 /* settings_tab@2x.png */; }; @@ -1145,6 +1149,11 @@ E1CD329418BCFF9900B1A496 /* SoundInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoundInstance.h; sourceTree = ""; }; E1CD329518BCFF9900B1A496 /* SoundInstance.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SoundInstance.m; sourceTree = ""; }; FC15B7BE1A1F80F200F59801 /* defaultConctact_light@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "defaultConctact_light@2x.png"; sourceTree = ""; }; + FC1615161A37935600F1761D /* NotificationPreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationPreviewViewController.h; sourceTree = ""; }; + FC1615171A37935600F1761D /* NotificationPreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotificationPreviewViewController.m; sourceTree = ""; }; + FC1615191A37945D00F1761D /* notification_no_preview_with_name@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "notification_no_preview_with_name@2x.png"; sourceTree = ""; }; + FC16151A1A37945D00F1761D /* notification_no_preview_no_name@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "notification_no_preview_no_name@2x.png"; sourceTree = ""; }; + FC16151B1A37945D00F1761D /* notification_with_preview@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "notification_with_preview@2x.png"; sourceTree = ""; }; FC18803A1A31D94D0044CE86 /* SignalTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SignalTabBarController.h; path = "view controllers/SignalTabBarController.h"; sourceTree = ""; }; FC18803B1A31D94D0044CE86 /* SignalTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SignalTabBarController.m; path = "view controllers/SignalTabBarController.m"; sourceTree = ""; }; FC1F90BF1A22342B004F8253 /* group_photo@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "group_photo@2x.png"; sourceTree = ""; }; @@ -2131,6 +2140,9 @@ FCA52AE41A2B676C00CCADFA /* message_error@2x.png */, B633C5411A1D190B0059AC12 /* mute_off@2x.png */, B633C5421A1D190B0059AC12 /* mute_on@2x.png */, + FC16151A1A37945D00F1761D /* notification_no_preview_no_name@2x.png */, + FC1615191A37945D00F1761D /* notification_no_preview_with_name@2x.png */, + FC16151B1A37945D00F1761D /* notification_with_preview@2x.png */, B633C54B1A1D190B0059AC12 /* photo@2x.png */, B633C54C1A1D190B0059AC12 /* quit@2x.png */, B633C54E1A1D190B0059AC12 /* red-delete@2x.png */, @@ -2589,6 +2601,8 @@ children = ( FC31962E1A0814130094C78E /* SettingsTableViewController.h */, FC31962F1A0814130094C78E /* SettingsTableViewController.m */, + FC1615161A37935600F1761D /* NotificationPreviewViewController.h */, + FC1615171A37935600F1761D /* NotificationPreviewViewController.m */, ); name = Settings; sourceTree = ""; @@ -2844,7 +2858,9 @@ B633C5CE1A1D190B0059AC12 /* quit@2x.png in Resources */, E148750A18A06966002CC4F3 /* InCallViewController.xib in Resources */, FCA52AEB1A2B676C00CCADFA /* checkmark_light@2x.png in Resources */, + FC16151C1A37945D00F1761D /* notification_no_preview_with_name@2x.png in Resources */, B633C5D01A1D190B0059AC12 /* red-delete@2x.png in Resources */, + FC16151E1A37945D00F1761D /* notification_with_preview@2x.png in Resources */, B633C59D1A1D190B0059AC12 /* endcall@2x.png in Resources */, B633C5B41A1D190B0059AC12 /* keypad@2x.png in Resources */, B633C5DA1A1D190B0059AC12 /* settings_dark@2x.png in Resources */, @@ -2865,6 +2881,7 @@ B66DBF4A19D5BBC8006EA940 /* Images.xcassets in Resources */, FCA52AE71A2B676C00CCADFA /* call_failed@2x.png in Resources */, 70B8FEE21909FE360042E3F0 /* 171756__nenadsimic__picked-coin-echo-2.wav in Resources */, + FC16151D1A37945D00F1761D /* notification_no_preview_no_name@2x.png in Resources */, B633C5801A1D190B0059AC12 /* archive@2x.png in Resources */, FC1F90C71A223991004F8253 /* signals_tab@2x.png in Resources */, B633C5C31A1D190B0059AC12 /* mute_off@2x.png in Resources */, @@ -3104,6 +3121,7 @@ 76EB058218170B33006006FC /* Environment.m in Sources */, 76EB064418170B33006006FC /* ThreadManager.m in Sources */, E197B61E18BBEC6D00F073E5 /* AudioRouter.m in Sources */, + FC1615181A37935600F1761D /* NotificationPreviewViewController.m in Sources */, E197B60D18BBEC1A00F073E5 /* AudioSocket.m in Sources */, FCF72A081A01A765006BC849 /* ContactsTableViewController.m in Sources */, FC31962D1A06A2190094C78E /* FingerprintViewController.m in Sources */, diff --git a/Signal/Images/notification_no_preview_no_name@2x.png b/Signal/Images/notification_no_preview_no_name@2x.png new file mode 100644 index 000000000..4ba66759a Binary files /dev/null and b/Signal/Images/notification_no_preview_no_name@2x.png differ diff --git a/Signal/Images/notification_no_preview_with_name@2x.png b/Signal/Images/notification_no_preview_with_name@2x.png new file mode 100644 index 000000000..bd00e898f Binary files /dev/null and b/Signal/Images/notification_no_preview_with_name@2x.png differ diff --git a/Signal/Images/notification_with_preview@2x.png b/Signal/Images/notification_with_preview@2x.png new file mode 100644 index 000000000..515c9a99f Binary files /dev/null and b/Signal/Images/notification_with_preview@2x.png differ diff --git a/Signal/src/environment/PreferencesUtil.h b/Signal/src/environment/PreferencesUtil.h index 76f550f26..b5271ce26 100644 --- a/Signal/src/environment/PreferencesUtil.h +++ b/Signal/src/environment/PreferencesUtil.h @@ -3,6 +3,12 @@ #import "PropertyListPreferences.h" #import "Zid.h" +typedef NS_ENUM(NSUInteger, NotificationType) { + NotificationNoNameNoPreview, + NotificationNameNoPreview, + NotificationNamePreview, +}; + @class PhoneNumber; @interface PropertyListPreferences (PropertyUtil) @@ -18,6 +24,9 @@ -(BOOL)screenSecurityIsEnabled; -(void)setScreenSecurity:(BOOL)flag; +-(NotificationType)notificationPreviewType; +-(void)setNotificationPreviewType:(NotificationType)type; + -(NSString*)lastRanVersion; -(NSString*)setAndGetCurrentVersion; diff --git a/Signal/src/environment/PreferencesUtil.m b/Signal/src/environment/PreferencesUtil.m index 842135137..192ff1754 100644 --- a/Signal/src/environment/PreferencesUtil.m +++ b/Signal/src/environment/PreferencesUtil.m @@ -23,6 +23,7 @@ #define PUSH_REVOKED_KEY @"Push Revoked Key" #define SCREEN_SECURITY_KEY @"Screen Security Key" #define DEBUG_IS_ENABLED_KEY @"Debugging Log Enabled Key" +#define NOTIFICATION_PREVIEW_TYPE_KEY @"Notification Preview Type Key" #define kSignalVersionKey @"SignalUpdateVersionKey" @@ -117,6 +118,21 @@ } } +-(NotificationType)notificationPreviewType { + NSNumber *preference = [self tryGetValueForKey:NOTIFICATION_PREVIEW_TYPE_KEY]; + + if (preference) { + return [preference unsignedIntegerValue]; + } else { + return NotificationNamePreview; + } +} + +-(void)setNotificationPreviewType:(NotificationType)type +{ + [self setValueForKey:NOTIFICATION_PREVIEW_TYPE_KEY toValue:@(type)]; +} + -(void)setScreenSecurity:(BOOL)flag{ [self setValueForKey:SCREEN_SECURITY_KEY toValue:@(flag)]; } diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.m b/Signal/src/textsecure/Messages/TSMessagesManager.m index ed35a6c91..23bb39a0a 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.m +++ b/Signal/src/textsecure/Messages/TSMessagesManager.m @@ -31,6 +31,9 @@ #import "NSData+messagePadding.h" +#import "Environment.h" +#import "PreferencesUtil.h" + #import #define ddLogLevel LOG_LEVEL_VERBOSE @@ -276,11 +279,30 @@ } - (void)notifyUserForIncomingMessage:(TSIncomingMessage*)message from:(NSString*)name{ + UILocalNotification *notification = [[UILocalNotification alloc] init]; - notification.alertBody = [NSString stringWithFormat:@"%@: %@", name, message.body]; + notification.alertBody = [self alertBodyForNotificationSetting:[Environment.preferences notificationPreviewType] withMessage:message from:name]; notification.soundName = @"default"; notification.category = Signal_Message_Category; [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; } +-(NSString*)alertBodyForNotificationSetting:(NotificationType)setting withMessage:(TSIncomingMessage*)message from:(NSString*)name +{ + switch (setting) { + case NotificationNoNameNoPreview: + return @"New message"; + break; + case NotificationNameNoPreview: + return [NSString stringWithFormat:@"New message from %@", name]; + break; + case NotificationNamePreview: + return [NSString stringWithFormat:@"%@ : %@", name, message.body]; + break; + default: + DDLogWarn(@"Unexpected notification type %ld", setting); + break; + } +} + @end diff --git a/Signal/src/view controllers/ContactsTableViewController.m b/Signal/src/view controllers/ContactsTableViewController.m index 905ec6946..ee8494bdb 100644 --- a/Signal/src/view controllers/ContactsTableViewController.m +++ b/Signal/src/view controllers/ContactsTableViewController.m @@ -125,14 +125,15 @@ static NSString *const CONTACT_BROWSE_TABLE_CELL_IDENTIFIER = @"ContactTableView - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { - NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"fullName contains[c] %@", searchText]; - searchResults = [self.latestContacts filteredArrayUsingPredicate:resultPredicate]; + + NSPredicate *numberPredicate = [NSPredicate predicateWithFormat:@"ANY SELF.userTextPhoneNumbers contains[cd] %@ OR fullName contains[c] %@", searchText, searchText]; + + searchResults = [self.latestContacts filteredArrayUsingPredicate:numberPredicate]; if (!searchResults.count && _searchController.searchBar.text.length == 0) { searchResults = self.latestContacts; } } - #pragma mark - Contact functions - (void)setupContacts { @@ -180,7 +181,7 @@ static NSString *const CONTACT_BROWSE_TABLE_CELL_IDENTIFIER = @"ContactTableView - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - if ([[self contactsForSectionIndex:(NSUInteger)section] count]) { + if ([[self contactsForSectionIndex:(NSUInteger)section] count] && !self.searchController.isActive) { return self.latestSortedAlphabeticalContactKeys[(NSUInteger)section]; } else { return nil; diff --git a/Signal/src/view controllers/NotificationPreviewViewController.h b/Signal/src/view controllers/NotificationPreviewViewController.h new file mode 100644 index 000000000..d9e435316 --- /dev/null +++ b/Signal/src/view controllers/NotificationPreviewViewController.h @@ -0,0 +1,13 @@ +// +// NotificationPreviewViewController.h +// Signal +// +// Created by Dylan Bourgeois on 09/12/14. +// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// + +#import + +@interface NotificationPreviewViewController : UITableViewController + +@end diff --git a/Signal/src/view controllers/NotificationPreviewViewController.m b/Signal/src/view controllers/NotificationPreviewViewController.m new file mode 100644 index 000000000..018c68055 --- /dev/null +++ b/Signal/src/view controllers/NotificationPreviewViewController.m @@ -0,0 +1,118 @@ +// +// NotificationPreviewViewController.m +// Signal +// +// Created by Dylan Bourgeois on 09/12/14. +// Copyright (c) 2014 Open Whisper Systems. All rights reserved. +// + +#import "NotificationPreviewViewController.h" +#import "UIUtil.h" + +#import "PreferencesUtil.h" +#import "Environment.h" + +@interface NotificationPreviewViewController () +@property (nonatomic) NSIndexPath *defaultSelectedIndexPath; +@end + +@implementation NotificationPreviewViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.navigationItem.title = @"Notification Style"; + self.tableView.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero]; + self.clearsSelectionOnViewWillAppear = NO; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +-(void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + NSInteger currentSetting = (NSInteger)[Environment.preferences notificationPreviewType]; + _defaultSelectedIndexPath = [NSIndexPath indexPathForRow:0 inSection:currentSetting+1]; + [self selectRowAtIndexPath:_defaultSelectedIndexPath]; +} + +#pragma mark - Table view data source + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 4; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return 1; +} + +- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section +{ + UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view; + [header.textLabel setTextColor:[UIColor blackColor]]; + [header.textLabel setFont:[UIFont ows_thinFontWithSize:14.0f]]; + +} + +-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + + if (_defaultSelectedIndexPath != nil && ![_defaultSelectedIndexPath isEqual:indexPath]) + { + [self deselectRowAtIndexPath:_defaultSelectedIndexPath]; + _defaultSelectedIndexPath = nil; + } + + UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:indexPath]; + cell.accessoryType = UITableViewCellAccessoryCheckmark; + + switch (indexPath.section) { + case 1: + [Environment.preferences setNotificationPreviewType:NotificationNoNameNoPreview]; + break; + + case 2: + [Environment.preferences setNotificationPreviewType:NotificationNameNoPreview]; + break; + + case 3: + [Environment.preferences setNotificationPreviewType:NotificationNamePreview]; + break; + + default: + break; + } + +} + +- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:indexPath]; + cell.accessoryType = UITableViewCellAccessoryNone; +} + +-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (indexPath.section == 0) { + return 120.0f; + } else { + return 80.0f; + } +} + +#pragma mark - Cell selection proxy + +-(void)selectRowAtIndexPath:(NSIndexPath*)indexPath +{ + [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:indexPath]; +} + +-(void)deselectRowAtIndexPath:(NSIndexPath*)indexPath +{ + [self.tableView.delegate tableView:self.tableView didDeselectRowAtIndexPath:indexPath]; +} + + + +@end diff --git a/Signal/src/view controllers/SettingsTableViewController.m b/Signal/src/view controllers/SettingsTableViewController.m index b487b74d7..55870e19a 100644 --- a/Signal/src/view controllers/SettingsTableViewController.m +++ b/Signal/src/view controllers/SettingsTableViewController.m @@ -22,14 +22,15 @@ #define kNumberOfSections 2 -#define kClearHistoryLogCellRow 1 -#define kSendDebugLogCellRow 3 -#define kUnregisterCell 4 +#define kClearHistoryLogCellRow 2 +#define kMessageDisplayCellRow 3 +#define kSendDebugLogCellRow 4 +#define kUnregisterCell 5 typedef enum { kProfileRows = 1, - kSecurityRows = 5, + kSecurityRows = 6, } kRowsForSection; typedef enum {