From 7c6e9e07b800df182210c0c86bca343177856097 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 14 Sep 2016 12:19:05 -0400 Subject: [PATCH] Read receipts remove lockscreen notifications No need to have a notification for a message you've already read on desktop. // FREEBIE --- Podfile | 2 +- Podfile.lock | 7 +- Signal.xcodeproj/project.pbxproj | 16 +++++ Signal/Signal-Info.plist | 2 +- Signal/src/AppDelegate.m | 31 ++++++-- .../Observers/OWSStaleNotificationObserver.h | 15 ++++ .../Observers/OWSStaleNotificationObserver.m | 71 +++++++++++++++++++ Signal/src/network/PushManager.h | 5 +- Signal/src/network/PushManager.m | 17 +++-- 9 files changed, 147 insertions(+), 19 deletions(-) create mode 100644 Signal/src/Observers/OWSStaleNotificationObserver.h create mode 100644 Signal/src/Observers/OWSStaleNotificationObserver.m diff --git a/Podfile b/Podfile index a5357a9cc..6e57ae933 100644 --- a/Podfile +++ b/Podfile @@ -3,7 +3,7 @@ source 'https://github.com/CocoaPods/Specs.git' target 'Signal' do pod 'SocketRocket', :git => 'https://github.com/facebook/SocketRocket.git' - pod 'SignalServiceKit', git: 'https://github.com/WhisperSystems/SignalServiceKit.git', branch: 'desktop-integration' + pod 'SignalServiceKit', git: 'https://github.com/WhisperSystems/SignalServiceKit.git' #pod 'SignalServiceKit', path: '../SignalServiceKit' pod 'OpenSSL', '~> 1.0.208' pod 'PastelogKit', '~> 1.3' diff --git a/Podfile.lock b/Podfile.lock index 8d33f698c..6171f4a18 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -119,19 +119,18 @@ DEPENDENCIES: - OpenSSL (~> 1.0.208) - PastelogKit (~> 1.3) - SCWaveformView (~> 1.0) - - SignalServiceKit (from `https://github.com/WhisperSystems/SignalServiceKit.git`, branch `desktop-integration`) + - SignalServiceKit (from `https://github.com/WhisperSystems/SignalServiceKit.git`) - SocketRocket (from `https://github.com/facebook/SocketRocket.git`) EXTERNAL SOURCES: SignalServiceKit: - :branch: desktop-integration :git: https://github.com/WhisperSystems/SignalServiceKit.git SocketRocket: :git: https://github.com/facebook/SocketRocket.git CHECKOUT OPTIONS: SignalServiceKit: - :commit: 800e2a95412045f565e7559b77b05eff5567cb95 + :commit: 9821e0c0d03a01f556680a6ae869b70bf5b93681 :git: https://github.com/WhisperSystems/SignalServiceKit.git SocketRocket: :commit: 8096fef47d582bff8ae3758c9ae7af1d55ea53d6 @@ -162,6 +161,6 @@ SPEC CHECKSUMS: UnionFind: c33be5adb12983981d6e827ea94fc7f9e370f52d YapDatabase: b1e43555a34a5298e23a045be96817a5ef0da58f -PODFILE CHECKSUM: 430c423130f22d8319fc2a420b55a4a3c7b39c9a +PODFILE CHECKSUM: 5dccee4c1c1ba5d4bf9575a81eeede82d1e89e8b COCOAPODS: 1.0.1 diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index fecf47dd2..8af79b75f 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -24,6 +24,8 @@ 458E383A1D6699FA0094BD24 /* OWSDeviceProvisioningURLParserTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 458E38391D6699FA0094BD24 /* OWSDeviceProvisioningURLParserTest.m */; }; 459311FC1D75C948008DD4F0 /* OWSDeviceTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 459311FB1D75C948008DD4F0 /* OWSDeviceTableViewCell.m */; }; 459C3F0D1C9B3A1B003ACF51 /* TSMessageAdapterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 459C3F0C1C9B3A1B003ACF51 /* TSMessageAdapterTest.m */; }; + 45BFFFA81D898AF0004A12A7 /* OWSStaleNotificationObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 45BFFFA71D898AF0004A12A7 /* OWSStaleNotificationObserver.m */; }; + 45BFFFA91D898AF0004A12A7 /* OWSStaleNotificationObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 45BFFFA71D898AF0004A12A7 /* OWSStaleNotificationObserver.m */; }; 45C681B71D305A580050903A /* OWSCall.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C681B61D305A580050903A /* OWSCall.m */; }; 45C681B81D305A580050903A /* OWSCall.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C681B61D305A580050903A /* OWSCall.m */; }; 45C681BC1D305C080050903A /* OWSCallCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C681BA1D305C080050903A /* OWSCallCollectionViewCell.m */; }; @@ -537,6 +539,8 @@ 4597E94E1D8313C100040CDE /* sq */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sq; path = translations/sq.lproj/Localizable.strings; sourceTree = ""; }; 4597E94F1D8313CB00040CDE /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = translations/bg.lproj/Localizable.strings; sourceTree = ""; }; 459C3F0C1C9B3A1B003ACF51 /* TSMessageAdapterTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TSMessageAdapterTest.m; path = "view controllers/Signals/TSMessageAdapters/TSMessageAdapterTest.m"; sourceTree = ""; }; + 45BFFFA61D898AF0004A12A7 /* OWSStaleNotificationObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSStaleNotificationObserver.h; path = Observers/OWSStaleNotificationObserver.h; sourceTree = ""; }; + 45BFFFA71D898AF0004A12A7 /* OWSStaleNotificationObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSStaleNotificationObserver.m; path = Observers/OWSStaleNotificationObserver.m; sourceTree = ""; }; 45C681B51D305A580050903A /* OWSCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSCall.h; sourceTree = ""; }; 45C681B61D305A580050903A /* OWSCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSCall.m; sourceTree = ""; }; 45C681B91D305C080050903A /* OWSCallCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSCallCollectionViewCell.h; sourceTree = ""; }; @@ -1167,6 +1171,15 @@ name = TSMessageAdapters; sourceTree = ""; }; + 45BFFFA51D898AB8004A12A7 /* Observers */ = { + isa = PBXGroup; + children = ( + 45BFFFA61D898AF0004A12A7 /* OWSStaleNotificationObserver.h */, + 45BFFFA71D898AF0004A12A7 /* OWSStaleNotificationObserver.m */, + ); + name = Observers; + sourceTree = ""; + }; 70B8009F190C529C0042E3F0 /* Products */ = { isa = PBXGroup; children = ( @@ -1218,6 +1231,7 @@ 457F3AC01D14A0F700C51351 /* Models */, 76EB052B18170B33006006FC /* Views */, 76EB04FE18170B33006006FC /* View Controllers */, + 45BFFFA51D898AB8004A12A7 /* Observers */, ); path = src; sourceTree = ""; @@ -2689,6 +2703,7 @@ E197B61918BBEC1A00F073E5 /* RemoteIOBufferListWrapper.m in Sources */, 76EB05A618170B33006006FC /* RtpPacket.m in Sources */, 76EB064218170B33006006FC /* StringUtil.m in Sources */, + 45BFFFA81D898AF0004A12A7 /* OWSStaleNotificationObserver.m in Sources */, A547DD741A70A87800103EC7 /* DJWActionSheet+OWS.m in Sources */, 45C681B71D305A580050903A /* OWSCall.m in Sources */, 76EB062618170B33006006FC /* Queue.m in Sources */, @@ -2883,6 +2898,7 @@ B660F7311C29988E00687D6E /* IpEndPoint.m in Sources */, B660F7321C29988E00687D6E /* PacketHandler.m in Sources */, B660F7331C29988E00687D6E /* RtpPacket.m in Sources */, + 45BFFFA91D898AF0004A12A7 /* OWSStaleNotificationObserver.m in Sources */, B660F7341C29988E00687D6E /* RtpSocket.m in Sources */, B660F7351C29988E00687D6E /* SequenceCounter.m in Sources */, B660F7361C29988E00687D6E /* SrtpSocket.m in Sources */, diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist index 2ae2e7fb2..ebd517540 100644 --- a/Signal/Signal-Info.plist +++ b/Signal/Signal-Info.plist @@ -38,7 +38,7 @@ CFBundleVersion - 2.5.0.11 + 2.5.0.12 ITSAppUsesNonExemptEncryption LOGS_EMAIL diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 1659a1fd7..514af3c05 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -15,6 +15,7 @@ #import "TSSocketManager.h" #import "TextSecureKitEnv.h" #import "VersionMigrations.h" +#import "OWSStaleNotificationObserver.h" #import static NSString *const kStoryboardName = @"Storyboard"; @@ -26,6 +27,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; @property (nonatomic, retain) UIWindow *screenProtectionWindow; @property (nonatomic) OWSReadReceiptObserver *readReceiptObserver; +@property (nonatomic) OWSStaleNotificationObserver *staleNotificationObserver; @end @@ -119,20 +121,25 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; [TextSecureKitEnv sharedEnv].contactsManager = [Environment getCurrent].contactsManager; [[TSStorageManager sharedManager] setupDatabase]; [TextSecureKitEnv sharedEnv].notificationsManager = [[NotificationsManager alloc] init]; - self.readReceiptObserver = - [[OWSReadReceiptObserver alloc] initWithMessagesManager:[TSMessagesManager sharedManager]]; + self.readReceiptObserver = [OWSReadReceiptObserver new]; [self.readReceiptObserver startObserving]; + + self.staleNotificationObserver = [OWSStaleNotificationObserver new]; + [self.staleNotificationObserver startObserving]; } -- (void)application:(UIApplication *)application - didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + DDLogDebug(@"%@ Successfully registered for remote notifications with token: %@", self.tag, deviceToken); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:deviceToken]; } -- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + DDLogError(@"%@ Failed to register for remote notifications with error %@", self.tag, error); #ifdef DEBUG - DDLogWarn(@"We're in debug mode, and registered a fake push identifier"); - [PushManager.sharedManager.pushNotificationFutureSource trySetResult:@"aFakePushIdentifier"]; + DDLogWarn(@"%@ We're in debug mode. Faking success for remote registration with a fake push identifier", self.tag); + [PushManager.sharedManager.pushNotificationFutureSource trySetResult:[NSData dataWithLength:32]]; #else [PushManager.sharedManager.pushNotificationFutureSource trySetFailure:error]; #endif @@ -352,4 +359,14 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; return NO; } ++ (NSString *)tag +{ + return [NSString stringWithFormat:@"[%@]", self.class]; +} + +- (NSString *)tag +{ + return self.class.tag; +} + @end diff --git a/Signal/src/Observers/OWSStaleNotificationObserver.h b/Signal/src/Observers/OWSStaleNotificationObserver.h new file mode 100644 index 000000000..833a47aaa --- /dev/null +++ b/Signal/src/Observers/OWSStaleNotificationObserver.h @@ -0,0 +1,15 @@ +// Created by Michael Kirk on 9/14/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. + +NS_ASSUME_NONNULL_BEGIN + +@class PushManager; + +@interface OWSStaleNotificationObserver : NSObject + +- (instancetype)initWithPushManager:(PushManager *)pushManager NS_DESIGNATED_INITIALIZER; +- (void)startObserving; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/Observers/OWSStaleNotificationObserver.m b/Signal/src/Observers/OWSStaleNotificationObserver.m new file mode 100644 index 000000000..b4576d369 --- /dev/null +++ b/Signal/src/Observers/OWSStaleNotificationObserver.m @@ -0,0 +1,71 @@ +// Created by Michael Kirk on 9/14/16. +// Copyright © 2016 Open Whisper Systems. All rights reserved. + +#import "OWSStaleNotificationObserver.h" +#import "PushManager.h" +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSStaleNotificationObserver () + +@property (nonatomic, readonly) PushManager *pushManager; + +@end + +@implementation OWSStaleNotificationObserver + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (instancetype)init +{ + return [self initWithPushManager:[PushManager sharedManager]]; +} + +- (instancetype)initWithPushManager:(PushManager *)pushManager +{ + self = [super init]; + if (!self) { + return self; + } + + _pushManager = pushManager; + + return self; +} + +- (void)startObserving +{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleMessageRead:) + name:OWSReadReceiptsProcessorMarkedMessageAsReadNotification + object:nil]; +} + +- (void)handleMessageRead:(NSNotification *)notification +{ + if ([notification.object isKindOfClass:[TSIncomingMessage class]]) { + TSIncomingMessage *message = (TSIncomingMessage *)notification.object; + + DDLogDebug(@"%@ canceled notification for message:%@", self.tag, message); + [self.pushManager cancelNotificationsWithThreadId:message.uniqueThreadId]; + } +} + ++ (NSString *)tag +{ + return [NSString stringWithFormat:@"[%@]", self.class]; +} + +- (NSString *)tag +{ + return self.class.tag; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/network/PushManager.h b/Signal/src/network/PushManager.h index 0f1adb672..572406568 100644 --- a/Signal/src/network/PushManager.h +++ b/Signal/src/network/PushManager.h @@ -7,7 +7,7 @@ // #import -#import +#import #define Signal_Thread_UserInfo_Key @"Signal_Thread_Id" #define Signal_Message_UserInfo_Key @"Signal_Message_Id" @@ -33,7 +33,7 @@ typedef void (^pushTokensSuccessBlock)(NSString *pushToken, NSString *voipToken) * The Push Manager is responsible for registering the device for Signal push notifications. */ -@interface PushManager : NSObject +@interface PushManager : NSObject + (PushManager *)sharedManager; @@ -65,6 +65,7 @@ typedef void (^pushTokensSuccessBlock)(NSString *pushToken, NSString *voipToken) - (BOOL)supportsVOIPPush; - (UILocalNotification *)closeVOIPBackgroundTask; - (void)presentNotification:(UILocalNotification *)notification; +- (void)cancelNotificationsWithThreadId:(NSString *)threadId; #pragma mark Push Notifications Delegate Methods diff --git a/Signal/src/network/PushManager.m b/Signal/src/network/PushManager.m index 0785502d0..a856237bb 100644 --- a/Signal/src/network/PushManager.m +++ b/Signal/src/network/PushManager.m @@ -6,8 +6,6 @@ // Copyright (c) 2014 Open Whisper Systems. All rights reserved. // -#import - #import "AppDelegate.h" #import "OWSContactsManager.h" #import "InCallViewController.h" @@ -22,7 +20,7 @@ #define pushManagerDomain @"org.whispersystems.pushmanager" -@interface PushManager () +@interface PushManager () @property TOCFutureSource *registerWithServerFutureSource; @property UIAlertView *missingPermissionsAlertView; @@ -298,7 +296,8 @@ - (void)requestPushTokenWithSuccess:(pushTokensSuccessBlock)success failure:(failedPushRegistrationBlock)failure { if (!self.wantRemoteNotifications) { - success(@"FakeToken", @"FakePushToken"); + DDLogWarn(@"%@ Using fake push tokens", self.tag); + success(@"fakePushToken", @"fakeVoipToken"); return; } @@ -451,4 +450,14 @@ [self.currentNotifications removeObjectsInArray:toDelete]; } ++ (NSString *)tag +{ + return [NSString stringWithFormat:@"[%@]", self.class]; +} + +- (NSString *)tag +{ + return self.class.tag; +} + @end