Add per-thread custom notification sounds.
This commit is contained in:
parent
9aa02489b8
commit
dc8b8ca0bd
@ -4,6 +4,12 @@
|
||||
|
||||
#import "OWSTableViewController.h"
|
||||
|
||||
@class TSThread;
|
||||
|
||||
@interface NotificationSoundsViewController : OWSTableViewController
|
||||
|
||||
// This property is optional. If it is not set, we are
|
||||
// editing the global notification sound.
|
||||
@property (nonatomic, nullable) TSThread *thread;
|
||||
|
||||
@end
|
||||
|
||||
@ -3,15 +3,13 @@
|
||||
//
|
||||
|
||||
#import "NotificationSoundsViewController.h"
|
||||
#import <SignalMessaging/Environment.h>
|
||||
#import <SignalMessaging/NotificationSounds.h>
|
||||
#import <SignalMessaging/OWSPreferences.h>
|
||||
|
||||
@interface NotificationSoundsViewController ()
|
||||
|
||||
@property (nonatomic) BOOL isDirty;
|
||||
|
||||
@property (nonatomic) NotificationSound globalNotificationSound;
|
||||
@property (nonatomic) NotificationSound currentNotificationSound;
|
||||
|
||||
@end
|
||||
|
||||
@ -26,8 +24,8 @@
|
||||
[self setTitle:NSLocalizedString(@"NOTIFICATIONS_ITEM_SOUND",
|
||||
@"Label for settings view that allows user to change the notification sound.")];
|
||||
|
||||
OWSPreferences *preferences = [Environment preferences];
|
||||
self.globalNotificationSound = preferences.globalNotificationSound;
|
||||
self.currentNotificationSound = (self.thread ? [NotificationSounds notificationSoundForThread:self.thread]
|
||||
: [NotificationSounds globalNotificationSound]);
|
||||
|
||||
[self updateTableContents];
|
||||
[self updateNavigationItems];
|
||||
@ -69,7 +67,7 @@
|
||||
for (NSNumber *nsNotificationSound in [NotificationSounds allNotificationSounds]) {
|
||||
NotificationSound notificationSound = (NotificationSound)nsNotificationSound.intValue;
|
||||
OWSTableItem *item;
|
||||
if (notificationSound == self.globalNotificationSound) {
|
||||
if (notificationSound == self.currentNotificationSound) {
|
||||
item = [OWSTableItem
|
||||
checkmarkItemWithText:[NotificationSounds displayNameForNotificationSound:notificationSound]
|
||||
actionBlock:^{
|
||||
@ -96,11 +94,11 @@
|
||||
{
|
||||
[NotificationSounds playNotificationSound:notificationSound];
|
||||
|
||||
if (self.globalNotificationSound == notificationSound) {
|
||||
if (self.currentNotificationSound == notificationSound) {
|
||||
return;
|
||||
}
|
||||
|
||||
self.globalNotificationSound = notificationSound;
|
||||
self.currentNotificationSound = notificationSound;
|
||||
self.isDirty = YES;
|
||||
[self updateTableContents];
|
||||
[self updateNavigationItems];
|
||||
@ -114,8 +112,11 @@
|
||||
|
||||
- (void)saveWasPressed:(id)sender
|
||||
{
|
||||
OWSPreferences *preferences = [Environment preferences];
|
||||
preferences.globalNotificationSound = self.globalNotificationSound;
|
||||
if (self.thread) {
|
||||
[NotificationSounds setNotificationSound:self.currentNotificationSound forThread:self.thread];
|
||||
} else {
|
||||
[NotificationSounds setGlobalNotificationSound:self.currentNotificationSound];
|
||||
}
|
||||
|
||||
[self.navigationController popViewControllerAnimated:YES];
|
||||
}
|
||||
|
||||
@ -100,7 +100,7 @@
|
||||
};
|
||||
|
||||
if ([self shouldPlaySoundForNotification]) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
notification.soundName = [NotificationSounds filenameForNotificationSound:notificationSound];
|
||||
}
|
||||
|
||||
@ -140,7 +140,7 @@
|
||||
Signal_Thread_UserInfo_Key : thread.uniqueId
|
||||
};
|
||||
if ([self shouldPlaySoundForNotification]) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
notification.soundName = [NotificationSounds filenameForNotificationSound:notificationSound];
|
||||
}
|
||||
|
||||
@ -181,7 +181,7 @@
|
||||
Signal_Thread_UserInfo_Key : thread.uniqueId
|
||||
};
|
||||
if ([self shouldPlaySoundForNotification]) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
notification.soundName = [NotificationSounds filenameForNotificationSound:notificationSound];
|
||||
}
|
||||
|
||||
@ -226,7 +226,7 @@
|
||||
UILocalNotification *notification = [[UILocalNotification alloc] init];
|
||||
notification.userInfo = @{ Signal_Thread_UserInfo_Key : thread.uniqueId };
|
||||
if (shouldPlaySound) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
notification.soundName = [NotificationSounds filenameForNotificationSound:notificationSound];
|
||||
}
|
||||
|
||||
@ -247,7 +247,7 @@
|
||||
[[PushManager sharedManager] presentNotification:notification checkForCancel:NO];
|
||||
} else {
|
||||
if (shouldPlaySound && [Environment.preferences soundInForeground]) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
[NotificationSounds playNotificationSound:notificationSound];
|
||||
}
|
||||
}
|
||||
@ -289,7 +289,7 @@
|
||||
if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive && messageText) {
|
||||
UILocalNotification *notification = [[UILocalNotification alloc] init];
|
||||
if (shouldPlaySound) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
notification.soundName = [NotificationSounds filenameForNotificationSound:notificationSound];
|
||||
}
|
||||
|
||||
@ -352,7 +352,7 @@
|
||||
[[PushManager sharedManager] presentNotification:notification checkForCancel:YES];
|
||||
} else {
|
||||
if (shouldPlaySound && [Environment.preferences soundInForeground]) {
|
||||
NotificationSound notificationSound = [Environment preferences].globalNotificationSound;
|
||||
NotificationSound notificationSound = [NotificationSounds notificationSoundForThread:thread];
|
||||
[NotificationSounds playNotificationSound:notificationSound];
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,8 @@
|
||||
//
|
||||
|
||||
typedef NS_ENUM(NSUInteger, NotificationSound) {
|
||||
NotificationSound_Aurora = 0,
|
||||
NotificationSound_Default = 0,
|
||||
NotificationSound_Aurora,
|
||||
NotificationSound_Bamboo,
|
||||
NotificationSound_Chord,
|
||||
NotificationSound_Circles,
|
||||
@ -15,11 +16,12 @@ typedef NS_ENUM(NSUInteger, NotificationSound) {
|
||||
NotificationSound_Popcorn,
|
||||
NotificationSound_Pulse,
|
||||
NotificationSound_Synth,
|
||||
NotificationSound_Default = NotificationSound_Note,
|
||||
};
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class TSThread;
|
||||
|
||||
@interface NotificationSounds : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
@ -32,6 +34,12 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
+ (void)playNotificationSound:(NotificationSound)notificationSound;
|
||||
|
||||
+ (NotificationSound)globalNotificationSound;
|
||||
+ (void)setGlobalNotificationSound:(NotificationSound)notificationSound;
|
||||
|
||||
+ (NotificationSound)notificationSoundForThread:(TSThread *)thread;
|
||||
+ (void)setNotificationSound:(NotificationSound)notificationSound forThread:(TSThread *)thread;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
@ -4,9 +4,17 @@
|
||||
|
||||
#import "NotificationSounds.h"
|
||||
#import <AudioToolbox/AudioServices.h>
|
||||
#import <SignalServiceKit/TSStorageManager.h>
|
||||
#import <SignalServiceKit/TSThread.h>
|
||||
#import <SignalServiceKit/YapDatabaseConnection+OWS.h>
|
||||
|
||||
NSString *const kNotificationSoundsStorageNotificationCollection = @"kNotificationSoundsStorageNotificationCollection";
|
||||
NSString *const kNotificationSoundsStorageGlobalNotificationKey = @"kNotificationSoundsStorageGlobalNotificationKey";
|
||||
|
||||
@interface NotificationSounds ()
|
||||
|
||||
@property (nonatomic, readonly) YapDatabaseConnection *dbConnection;
|
||||
|
||||
@property (nonatomic) NSMutableDictionary<NSNumber *, NSNumber *> *systemSoundIDMap;
|
||||
|
||||
@end
|
||||
@ -26,6 +34,13 @@
|
||||
}
|
||||
|
||||
- (instancetype)initDefault
|
||||
{
|
||||
TSStorageManager *storageManager = [TSStorageManager sharedManager];
|
||||
|
||||
return [self initWithStorageManager:storageManager];
|
||||
}
|
||||
|
||||
- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager
|
||||
{
|
||||
self = [super init];
|
||||
|
||||
@ -33,6 +48,10 @@
|
||||
return self;
|
||||
}
|
||||
|
||||
OWSAssert(storageManager);
|
||||
|
||||
_dbConnection = storageManager.newDatabaseConnection;
|
||||
|
||||
OWSSingletonAssert();
|
||||
|
||||
return self;
|
||||
@ -76,6 +95,7 @@
|
||||
return @"Input";
|
||||
case NotificationSound_Keys:
|
||||
return @"Keys";
|
||||
case NotificationSound_Default:
|
||||
case NotificationSound_Note:
|
||||
return @"Note";
|
||||
case NotificationSound_Popcorn:
|
||||
@ -107,6 +127,7 @@
|
||||
return @"input.m4r";
|
||||
case NotificationSound_Keys:
|
||||
return @"keys.m4r";
|
||||
case NotificationSound_Default:
|
||||
case NotificationSound_Note:
|
||||
return @"note.m4r";
|
||||
case NotificationSound_Popcorn:
|
||||
@ -161,4 +182,43 @@
|
||||
AudioServicesPlayAlertSound(systemSoundID);
|
||||
}
|
||||
|
||||
+ (NotificationSound)defaultNotificationSound
|
||||
{
|
||||
return NotificationSound_Note;
|
||||
}
|
||||
|
||||
+ (NotificationSound)globalNotificationSound
|
||||
{
|
||||
NotificationSounds *notificationSounds = NotificationSounds.sharedManager;
|
||||
NSNumber *_Nullable value =
|
||||
[notificationSounds.dbConnection objectForKey:kNotificationSoundsStorageGlobalNotificationKey
|
||||
inCollection:kNotificationSoundsStorageNotificationCollection];
|
||||
return (value ? (NotificationSound)value.intValue : [self defaultNotificationSound]);
|
||||
}
|
||||
|
||||
+ (void)setGlobalNotificationSound:(NotificationSound)notificationSound
|
||||
{
|
||||
NotificationSounds *notificationSounds = NotificationSounds.sharedManager;
|
||||
[notificationSounds.dbConnection setObject:@(notificationSound)
|
||||
forKey:kNotificationSoundsStorageGlobalNotificationKey
|
||||
inCollection:kNotificationSoundsStorageNotificationCollection];
|
||||
}
|
||||
|
||||
+ (NotificationSound)notificationSoundForThread:(TSThread *)thread
|
||||
{
|
||||
NotificationSounds *notificationSounds = NotificationSounds.sharedManager;
|
||||
NSNumber *_Nullable value =
|
||||
[notificationSounds.dbConnection objectForKey:kNotificationSoundsStorageGlobalNotificationKey
|
||||
inCollection:kNotificationSoundsStorageNotificationCollection];
|
||||
return (value ? (NotificationSound)value.intValue : [self globalNotificationSound]);
|
||||
}
|
||||
|
||||
+ (void)setNotificationSound:(NotificationSound)notificationSound forThread:(TSThread *)thread
|
||||
{
|
||||
NotificationSounds *notificationSounds = NotificationSounds.sharedManager;
|
||||
[notificationSounds.dbConnection setObject:@(notificationSound)
|
||||
forKey:thread.uniqueId
|
||||
inCollection:kNotificationSoundsStorageNotificationCollection];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@ -2,8 +2,6 @@
|
||||
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NotificationSounds.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
@ -57,9 +55,6 @@ extern NSString *const OWSPreferencesKeyEnableDebugLog;
|
||||
- (void)setIOSUpgradeNagDate:(NSDate *)value;
|
||||
- (nullable NSDate *)iOSUpgradeNagDate;
|
||||
|
||||
- (NotificationSound)globalNotificationSound;
|
||||
- (void)setGlobalNotificationSound:(NotificationSound)notificationSound;
|
||||
|
||||
#pragma mark - Calling
|
||||
|
||||
#pragma mark Callkit
|
||||
|
||||
@ -26,7 +26,6 @@ NSString *const OWSPreferencesKeyCallsHideIPAddress = @"CallsHideIPAddress";
|
||||
NSString *const OWSPreferencesKeyHasDeclinedNoContactsView = @"hasDeclinedNoContactsView";
|
||||
NSString *const OWSPreferencesKeyIOSUpgradeNagDate = @"iOSUpgradeNagDate";
|
||||
NSString *const OWSPreferencesKey_IsReadyForAppExtensions = @"isReadyForAppExtensions_5";
|
||||
NSString *const OWSPreferencesKey_GlobalNotificationSound = @"GlobalNotificationSound";
|
||||
|
||||
@implementation OWSPreferences
|
||||
|
||||
@ -170,17 +169,6 @@ NSString *const OWSPreferencesKey_GlobalNotificationSound = @"GlobalNotification
|
||||
return [self tryGetValueForKey:OWSPreferencesKeyIOSUpgradeNagDate];
|
||||
}
|
||||
|
||||
- (NotificationSound)globalNotificationSound
|
||||
{
|
||||
NSNumber *value = [self tryGetValueForKey:OWSPreferencesKey_GlobalNotificationSound];
|
||||
return value ? (NotificationSound)[value intValue] : NotificationSound_Default;
|
||||
}
|
||||
|
||||
- (void)setGlobalNotificationSound:(NotificationSound)notificationSound
|
||||
{
|
||||
[self setValueForKey:OWSPreferencesKey_GlobalNotificationSound toValue:@(notificationSound)];
|
||||
}
|
||||
|
||||
#pragma mark - Calling
|
||||
|
||||
#pragma mark CallKit
|
||||
|
||||
Loading…
Reference in New Issue
Block a user