2014-05-06 19:41:08 +02:00
|
|
|
#import "PreferencesUtil.h"
|
|
|
|
#import "Constraints.h"
|
|
|
|
|
|
|
|
#import "NotificationManifest.h"
|
|
|
|
|
2014-05-07 00:33:20 +02:00
|
|
|
#define CALL_STREAM_DES_BUFFER_LEVEL_KEY @"CallStreamDesiredBufferLevel"
|
2014-07-11 00:33:51 +02:00
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
#define PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY @"Directory Bloom Hash Count"
|
|
|
|
#define PHONE_DIRECTORY_EXPIRATION @"Directory Expiration"
|
|
|
|
|
2014-05-07 00:33:20 +02:00
|
|
|
#define DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL 0.5
|
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
#define SETTINGS_EXPANDED_ROW_PREF_DICT_KEY @"Settings Expanded Row Pref Dict Key"
|
|
|
|
|
|
|
|
#define FRESH_INSTALL_TUTORIALS_ENABLED_KEY @"Fresh Install Tutorials Enabled Key"
|
|
|
|
#define CONTACT_IMAGES_ENABLED_KEY @"Contact Images Enabled Key"
|
|
|
|
#define AUTOCORRECT_ENABLED_KEY @"Autocorrect Enabled Key"
|
|
|
|
#define HISTORY_LOG_ENABLED_KEY @"History Log Enabled Key"
|
2014-08-01 07:53:58 +02:00
|
|
|
#define PUSH_REVOKED_KEY @"Push Revoked Key"
|
2014-08-09 18:27:26 +02:00
|
|
|
#define SCREEN_SECURITY_KEY @"Screen Security Key"
|
2014-08-09 01:01:05 +02:00
|
|
|
#define DEBUG_IS_ENABLED_KEY @"Debugging Log Enabled Key"
|
2014-12-08 21:16:18 +01:00
|
|
|
#define NOTIFICATION_PREVIEW_TYPE_KEY @"Notification Preview Type Key"
|
2014-12-26 21:17:43 +01:00
|
|
|
#define IMAGE_UPLOAD_QUALITY_KEY @"Image Upload Quality Key"
|
2015-02-09 17:31:22 +01:00
|
|
|
#define HAS_SENT_A_MESSAGE_KEY @"User has sent a message"
|
|
|
|
#define HAS_ARCHIVED_A_MESSAGE_KEY @"User archived a message"
|
2014-08-09 01:01:05 +02:00
|
|
|
#define kSignalVersionKey @"SignalUpdateVersionKey"
|
2015-04-14 21:49:00 +02:00
|
|
|
#define PLAY_SOUND_IN_FOREGROUND_KEY @"NotificationSoundInForeground"
|
2015-04-28 14:41:50 +02:00
|
|
|
#define HAS_REGISTERED_VOIP_PUSH @"VOIPPushEnabled"
|
2014-05-06 19:41:08 +02:00
|
|
|
|
2015-03-12 00:46:31 +01:00
|
|
|
#define BloomFilterCacheName @"bloomfilter"
|
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
@implementation PropertyListPreferences (PropertyUtil)
|
|
|
|
|
|
|
|
-(PhoneNumberDirectoryFilter*) tryGetSavedPhoneNumberDirectory {
|
|
|
|
NSUInteger hashCount = [[self tryGetValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY] unsignedIntegerValue];
|
2015-03-12 00:46:31 +01:00
|
|
|
NSData* data = [self tryRetreiveBloomFilter];
|
2014-05-06 19:41:08 +02:00
|
|
|
NSDate* expiration = [self tryGetValueForKey:PHONE_DIRECTORY_EXPIRATION];
|
2014-08-14 03:13:24 +02:00
|
|
|
if (hashCount == 0 || data.length == 0 || expiration == nil) return nil;
|
2014-05-06 19:41:08 +02:00
|
|
|
BloomFilter* bloomFilter = [BloomFilter bloomFilterWithHashCount:hashCount andData:data];
|
|
|
|
return [PhoneNumberDirectoryFilter phoneNumberDirectoryFilterWithBloomFilter:bloomFilter
|
|
|
|
andExpirationDate:expiration];
|
|
|
|
}
|
|
|
|
-(void) setSavedPhoneNumberDirectory:(PhoneNumberDirectoryFilter*)phoneNumberDirectoryFilter {
|
2015-03-12 00:46:31 +01:00
|
|
|
[self storeBloomfilter:nil];
|
2014-05-06 19:41:08 +02:00
|
|
|
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:nil];
|
|
|
|
[self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:nil];
|
|
|
|
if (phoneNumberDirectoryFilter == nil) return;
|
|
|
|
|
|
|
|
NSData* data = [[phoneNumberDirectoryFilter bloomFilter] data];
|
2014-08-13 02:02:29 +02:00
|
|
|
NSNumber* hashCount = @([[phoneNumberDirectoryFilter bloomFilter] hashCount]);
|
2014-09-08 01:31:05 +02:00
|
|
|
NSDate* expiry = phoneNumberDirectoryFilter.getExpirationDate;
|
2015-03-12 00:46:31 +01:00
|
|
|
[self storeBloomfilter:data];
|
2014-05-06 19:41:08 +02:00
|
|
|
[self setValueForKey:PHONE_DIRECTORY_BLOOM_FILTER_HASH_COUNT_KEY toValue:hashCount];
|
|
|
|
[self setValueForKey:PHONE_DIRECTORY_EXPIRATION toValue:expiry];
|
|
|
|
[self sendDirectoryUpdateNotification];
|
|
|
|
}
|
|
|
|
|
|
|
|
-(void) sendDirectoryUpdateNotification{
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_DIRECTORY_UPDATE object:nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
-(NSTimeInterval) getCachedOrDefaultDesiredBufferDepth {
|
|
|
|
id v = [self tryGetValueForKey:CALL_STREAM_DES_BUFFER_LEVEL_KEY];
|
|
|
|
if (v == nil) return DEFAULT_CALL_STREAM_DES_BUFFER_LEVEL;
|
|
|
|
return [v doubleValue];
|
|
|
|
}
|
|
|
|
-(void) setCachedDesiredBufferDepth:(double)value {
|
|
|
|
require(value >= 0);
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:CALL_STREAM_DES_BUFFER_LEVEL_KEY toValue:@(value)];
|
2014-05-06 19:41:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
-(BOOL) getFreshInstallTutorialsEnabled {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:FRESH_INSTALL_TUTORIALS_ENABLED_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else {
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-(BOOL) getContactImagesEnabled {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:CONTACT_IMAGES_ENABLED_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else {
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-(BOOL) getAutocorrectEnabled {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:AUTOCORRECT_ENABLED_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else {
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
-(BOOL) getHistoryLogEnabled {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:HISTORY_LOG_ENABLED_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else {
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-09 01:01:05 +02:00
|
|
|
- (BOOL)loggingIsEnabled{
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:DEBUG_IS_ENABLED_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-09 18:27:26 +02:00
|
|
|
-(BOOL)screenSecurityIsEnabled{
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:SCREEN_SECURITY_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-09 17:31:22 +01:00
|
|
|
- (BOOL) getHasSentAMessage{
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:HAS_SENT_A_MESSAGE_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) getHasArchivedAMessage {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:HAS_ARCHIVED_A_MESSAGE_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2015-01-30 23:11:35 +01:00
|
|
|
|
2015-04-28 14:41:50 +02:00
|
|
|
- (BOOL)hasRegisteredVOIPPush {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:HAS_REGISTERED_VOIP_PUSH];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2014-12-26 21:17:43 +01:00
|
|
|
-(TSImageQuality)imageUploadQuality {
|
2015-01-14 22:30:01 +01:00
|
|
|
// always return average image quality
|
|
|
|
return TSImageQualityMedium;
|
2014-12-26 21:17:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
-(void)setImageUploadQuality:(TSImageQuality)quality {
|
|
|
|
[self setValueForKey:IMAGE_UPLOAD_QUALITY_KEY toValue:@(quality)];
|
|
|
|
}
|
|
|
|
|
2014-08-09 18:27:26 +02:00
|
|
|
-(void)setScreenSecurity:(BOOL)flag{
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:SCREEN_SECURITY_KEY toValue:@(flag)];
|
2014-08-09 18:27:26 +02:00
|
|
|
}
|
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
-(void) setFreshInstallTutorialsEnabled:(BOOL)enabled {
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:FRESH_INSTALL_TUTORIALS_ENABLED_KEY toValue:@(enabled)];
|
2014-05-06 19:41:08 +02:00
|
|
|
}
|
2014-08-09 01:01:05 +02:00
|
|
|
|
2015-04-28 14:41:50 +02:00
|
|
|
-(void)setHasRegisteredVOIPPush:(BOOL)enabled {
|
|
|
|
[self setValueForKey:HAS_REGISTERED_VOIP_PUSH toValue:@(enabled)];
|
|
|
|
}
|
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
-(void) setContactImagesEnabled:(BOOL)enabled {
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:CONTACT_IMAGES_ENABLED_KEY toValue:@(enabled)];
|
2014-05-06 19:41:08 +02:00
|
|
|
}
|
|
|
|
-(void) setAutocorrectEnabled:(BOOL)enabled {
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:AUTOCORRECT_ENABLED_KEY toValue:@(enabled)];
|
2014-05-06 19:41:08 +02:00
|
|
|
}
|
|
|
|
-(void) setHistoryLogEnabled:(BOOL)enabled {
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:HISTORY_LOG_ENABLED_KEY toValue:@(enabled)];
|
2014-05-06 19:41:08 +02:00
|
|
|
}
|
2014-07-30 08:05:36 +02:00
|
|
|
|
2014-08-01 07:53:58 +02:00
|
|
|
-(BOOL) encounteredRevokedPushPermission{
|
|
|
|
return [[self tryGetValueForKey:PUSH_REVOKED_KEY] boolValue];
|
|
|
|
}
|
|
|
|
-(void) setRevokedPushPermission:(BOOL)revoked{
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:PUSH_REVOKED_KEY toValue:@(revoked)];
|
2014-08-01 07:53:58 +02:00
|
|
|
}
|
|
|
|
|
2014-08-09 01:01:05 +02:00
|
|
|
-(void) setLoggingEnabled:(BOOL)flag{
|
2014-08-13 02:02:29 +02:00
|
|
|
[self setValueForKey:DEBUG_IS_ENABLED_KEY toValue:@(flag)];
|
2014-08-09 01:01:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
-(NSString*)lastRanVersion{
|
2014-09-08 01:31:05 +02:00
|
|
|
return [NSUserDefaults.standardUserDefaults objectForKey:kSignalVersionKey];
|
2014-08-09 01:01:05 +02:00
|
|
|
}
|
|
|
|
|
2015-02-09 17:31:22 +01:00
|
|
|
- (void) setHasSentAMessage:(BOOL)enabled{
|
|
|
|
[self setValueForKey:HAS_SENT_A_MESSAGE_KEY toValue:@(enabled)];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) setHasArchivedAMessage:(BOOL)enabled{
|
|
|
|
[self setValueForKey:HAS_ARCHIVED_A_MESSAGE_KEY toValue:@(enabled)];
|
|
|
|
}
|
|
|
|
|
2014-08-09 01:01:05 +02:00
|
|
|
-(NSString*)setAndGetCurrentVersion{
|
2015-02-20 23:21:14 +01:00
|
|
|
NSString *currentVersion = [NSString stringWithFormat:@"%@", NSBundle.mainBundle.infoDictionary[@"CFBundleVersion"]];
|
|
|
|
[NSUserDefaults.standardUserDefaults setObject:currentVersion forKey:kSignalVersionKey];
|
2014-09-08 01:31:05 +02:00
|
|
|
[NSUserDefaults.standardUserDefaults synchronize];
|
2015-02-20 23:21:14 +01:00
|
|
|
return currentVersion;
|
2014-08-09 01:01:05 +02:00
|
|
|
}
|
|
|
|
|
2015-04-14 21:49:00 +02:00
|
|
|
|
|
|
|
#pragma mark Notification Preferences
|
|
|
|
|
|
|
|
- (BOOL)soundInForeground {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:PLAY_SOUND_IN_FOREGROUND_KEY];
|
|
|
|
if (preference) {
|
|
|
|
return [preference boolValue];
|
|
|
|
} else{
|
|
|
|
return YES;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setSoundInForeground:(BOOL)enabled {
|
|
|
|
[self setValueForKey:PLAY_SOUND_IN_FOREGROUND_KEY toValue:@(enabled)];
|
|
|
|
}
|
|
|
|
|
|
|
|
-(void)setNotificationPreviewType:(NotificationType)type
|
|
|
|
{
|
|
|
|
[self setValueForKey:NOTIFICATION_PREVIEW_TYPE_KEY toValue:@(type)];
|
|
|
|
}
|
|
|
|
|
|
|
|
-(NotificationType)notificationPreviewType {
|
|
|
|
NSNumber *preference = [self tryGetValueForKey:NOTIFICATION_PREVIEW_TYPE_KEY];
|
|
|
|
|
|
|
|
if (preference) {
|
|
|
|
return [preference unsignedIntegerValue];
|
|
|
|
} else {
|
|
|
|
return NotificationNamePreview;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString*)nameForNotificationPreviewType:(NotificationType)notificationType {
|
|
|
|
switch (notificationType) {
|
|
|
|
case NotificationNamePreview:
|
|
|
|
return NSLocalizedString(@"NOTIFICATIONS_SENDER_AND_MESSAGE", nil);
|
|
|
|
case NotificationNameNoPreview:
|
|
|
|
return NSLocalizedString(@"NOTIFICATIONS_SENDER_ONLY", nil);
|
|
|
|
case NotificationNoNameNoPreview:
|
|
|
|
return NSLocalizedString(@"NOTIFICATIONS_NONE", nil);
|
|
|
|
default:
|
|
|
|
DDLogWarn(@"Undefined NotificationType in Settings");
|
|
|
|
return @"";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-12 00:46:31 +01:00
|
|
|
#pragma mark Bloom filter
|
|
|
|
|
|
|
|
- (NSData*)tryRetreiveBloomFilter {
|
|
|
|
return [NSData dataWithContentsOfFile:[self bloomfilterPath]];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)storeBloomfilter:(NSData*)bloomFilterData {
|
|
|
|
if (!bloomFilterData) {
|
|
|
|
NSFileManager *fileManager = [NSFileManager defaultManager];
|
|
|
|
NSError *error;
|
|
|
|
|
|
|
|
if ([fileManager fileExistsAtPath:[self bloomfilterPath]]) {
|
|
|
|
[fileManager removeItemAtPath:[self bloomfilterPath] error:&error];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
DDLogError(@"Failed to remove bloomfilter with error: %@", error);
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
NSError *error;
|
|
|
|
[bloomFilterData writeToFile:[self bloomfilterPath] options:NSDataWritingAtomic error:&error];
|
|
|
|
if (error) {
|
|
|
|
DDLogError(@"Failed to store bloomfilter with error: %@", error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
- (NSString*)bloomfilterPath {
|
|
|
|
NSFileManager *fm = [NSFileManager defaultManager];
|
|
|
|
NSArray *cachesDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
|
|
|
|
NSString *bloomFilterPath = [cachesDir objectAtIndex:0];
|
|
|
|
NSError *error;
|
|
|
|
|
|
|
|
if (![fm fileExistsAtPath:bloomFilterPath]) {
|
|
|
|
[fm createDirectoryAtPath:bloomFilterPath withIntermediateDirectories:YES attributes:@{} error:&error];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
DDLogError(@"Failed to create caches directory with error: %@", error.description);
|
|
|
|
}
|
|
|
|
|
|
|
|
bloomFilterPath = [bloomFilterPath stringByAppendingPathComponent:BloomFilterCacheName];
|
|
|
|
|
|
|
|
return bloomFilterPath;
|
|
|
|
}
|
|
|
|
|
2014-05-06 19:41:08 +02:00
|
|
|
@end
|