From 6037a440c95890223a1d9da206ce2279905df2c3 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Tue, 10 Jul 2018 15:34:22 -0600 Subject: [PATCH] wire up window mgmt --- Signal.xcodeproj/project.pbxproj | 4 + .../Cells/ConversationViewCell.h | 2 + .../ConversationView/Cells/OWSMessageCell.m | 3 +- .../ConversationViewController.m | 6 ++ .../MessageActionsViewController.swift | 14 ++++ SignalMessaging/utils/OWSWindowManager.h | 4 + SignalMessaging/utils/OWSWindowManager.m | 78 +++++++++++++++++++ 7 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 Signal/src/ViewControllers/MessageActionsViewController.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 7f8870d99..ddf2caa9e 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -420,6 +420,7 @@ 4C20B2B920CA10DE001BAC90 /* ConversationSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C20B2B820CA10DE001BAC90 /* ConversationSearchViewController.swift */; }; 4C4AEC4520EC343B0020E72B /* DismissableTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4AEC4420EC343B0020E72B /* DismissableTextField.swift */; }; 4CC0B59C20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */; }; + 4CFF4C0A20F55BBA005DA313 /* MessageActionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF4C0920F55BBA005DA313 /* MessageActionsViewController.swift */; }; 70377AAB1918450100CAF501 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70377AAA1918450100CAF501 /* MobileCoreServices.framework */; }; 768A1A2B17FC9CD300E00ED8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 768A1A2A17FC9CD300E00ED8 /* libz.dylib */; }; 76C87F19181EFCE600C4ACAB /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C87F18181EFCE600C4ACAB /* MediaPlayer.framework */; }; @@ -1083,6 +1084,7 @@ 4C20B2B820CA10DE001BAC90 /* ConversationSearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationSearchViewController.swift; sourceTree = ""; }; 4C4AEC4420EC343B0020E72B /* DismissableTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DismissableTextField.swift; sourceTree = ""; }; 4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationConfigurationSyncOperation.swift; sourceTree = ""; }; + 4CFF4C0920F55BBA005DA313 /* MessageActionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActionsViewController.swift; sourceTree = ""; }; 69349DE607F5BA6036C9AC60 /* Pods-SignalShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SignalShareExtension/Pods-SignalShareExtension.debug.xcconfig"; sourceTree = ""; }; 70377AAA1918450100CAF501 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; 748A5CAEDD7C919FC64C6807 /* Pods_SignalTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SignalTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1689,6 +1691,7 @@ 452EC6DE205E9E30000E787C /* MediaGalleryViewController.swift */, 45F32C1D205718B000A300D5 /* MediaPageViewController.swift */, 454A84032059C787008B8C75 /* MediaTileViewController.swift */, + 4CFF4C0920F55BBA005DA313 /* MessageActionsViewController.swift */, 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */, 34B3F84F1E8DF1700035BE1A /* NewContactThreadViewController.h */, 34B3F8501E8DF1700035BE1A /* NewContactThreadViewController.m */, @@ -3246,6 +3249,7 @@ 4585C4681ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift in Sources */, 4C20B2B920CA10DE001BAC90 /* ConversationSearchViewController.swift in Sources */, 450D19131F85236600970622 /* RemoteVideoView.m in Sources */, + 4CFF4C0A20F55BBA005DA313 /* MessageActionsViewController.swift in Sources */, B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */, 34386A54207D271D009F5D9C /* NeverClearView.swift in Sources */, 45DF5DF21DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */, diff --git a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h index a530b4195..b0edb8c4d 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h +++ b/Signal/src/ViewControllers/ConversationView/Cells/ConversationViewCell.h @@ -22,6 +22,8 @@ NS_ASSUME_NONNULL_BEGIN @protocol ConversationViewCellDelegate +- (void)conversationCellDidLongpressText:(ConversationViewCell *)cell viewItem:(ConversationViewItem *)viewItem; + - (void)didPanWithGestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer viewItem:(ConversationViewItem *)conversationItem; diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 4e716f286..60e5605db 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -448,8 +448,7 @@ NS_ASSUME_NONNULL_BEGIN switch ([self.messageBubbleView gestureLocationForLocation:locationInMessageBubble]) { case OWSMessageGestureLocation_Default: case OWSMessageGestureLocation_OversizeText: { - CGPoint location = [sender locationInView:self]; - [self showTextMenuController:location]; + [self.delegate conversationCellDidLongpressText:self viewItem:self.viewItem]; break; } case OWSMessageGestureLocation_Media: { diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 5efadd928..c5362fb84 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -1980,6 +1980,12 @@ typedef enum : NSUInteger { #pragma mark - ConversationViewCellDelegate +- (void)conversationCellDidLongpressText:(ConversationViewCell *)cell viewItem:(ConversationViewItem *)viewItem +{ + UIViewController *messageActionsViewController = [MessageActionsViewController new]; + [[OWSWindowManager sharedManager] presentMessageActions:messageActionsViewController]; +} + - (NSAttributedString *)attributedContactOrProfileNameForPhoneIdentifier:(NSString *)recipientId { OWSAssertIsOnMainThread(); diff --git a/Signal/src/ViewControllers/MessageActionsViewController.swift b/Signal/src/ViewControllers/MessageActionsViewController.swift new file mode 100644 index 000000000..4aaf9748b --- /dev/null +++ b/Signal/src/ViewControllers/MessageActionsViewController.swift @@ -0,0 +1,14 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation + +@objc +class MessageActionsViewController: UIViewController { + + override func loadView() { + self.view = UIView() + view.backgroundColor = .purple + } +} diff --git a/SignalMessaging/utils/OWSWindowManager.h b/SignalMessaging/utils/OWSWindowManager.h index e325f2a21..23f435471 100644 --- a/SignalMessaging/utils/OWSWindowManager.h +++ b/SignalMessaging/utils/OWSWindowManager.h @@ -27,6 +27,10 @@ extern const UIWindowLevel UIWindowLevel_Background; - (void)setIsScreenBlockActive:(BOOL)isScreenBlockActive; +#pragma mark - Message Actions + +- (void)presentMessageActions:(UIViewController *)messageActionsViewController; + #pragma mark - Calls @property (nonatomic, readonly) BOOL shouldShowCallView; diff --git a/SignalMessaging/utils/OWSWindowManager.m b/SignalMessaging/utils/OWSWindowManager.m index 8a9ea7619..a4b7fa7ff 100644 --- a/SignalMessaging/utils/OWSWindowManager.m +++ b/SignalMessaging/utils/OWSWindowManager.m @@ -50,6 +50,14 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) return UIWindowLevelStatusBar + 2.f; } +// In front of everything, including the status bar. +const UIWindowLevel UIWindowLevel_MessageActions(void); +const UIWindowLevel UIWindowLevel_MessageActions(void) +{ + // TODO This won't cover the keyboard... + return UIWindowLevel_ScreenBlocking() - 1; +} + @implementation OWSWindowRootViewController - (BOOL)canBecomeFirstResponder @@ -74,6 +82,10 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) @property (nonatomic) UIWindow *callViewWindow; @property (nonatomic) UINavigationController *callNavigationController; +// UIWindowLevel_MessageActions +@property (nonatomic) UIWindow *messageActionsWindow; +@property (nonatomic, nullable) UIViewController *messageActionsViewController; + // UIWindowLevel_Background if inactive, // UIWindowLevel_ScreenBlocking() if active. @property (nonatomic) UIWindow *screenBlockingWindow; @@ -127,6 +139,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) self.returnToCallWindow = [self createReturnToCallWindow:rootWindow]; self.callViewWindow = [self createCallViewWindow:rootWindow]; + self.messageActionsWindow = [self createMessageActionsWindowWithRoowWindow:rootWindow]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeStatusBarFrame:) @@ -169,6 +182,20 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) return window; } +- (UIWindow *)createMessageActionsWindowWithRoowWindow:(UIWindow *)rootWindow +{ + UIWindow *window = [[UIWindow alloc] initWithFrame:rootWindow.bounds]; + window.hidden = YES; + window.windowLevel = UIWindowLevel_MessageActions(); + // window.opaque = YES; + window.backgroundColor = UIColor.clearColor; + + + // window.rootViewController = navigationController; + + return window; +} + - (UIWindow *)createCallViewWindow:(UIWindow *)rootWindow { OWSAssertIsOnMainThread(); @@ -210,6 +237,23 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) #pragma mark - Calls +- (void)presentMessageActions:(UIViewController *)messageActionsViewController +{ + self.messageActionsViewController = messageActionsViewController; + self.messageActionsWindow.rootViewController = messageActionsViewController; + [self ensureWindowState]; +} + +- (void)dismissMessageActions +{ + self.messageActionsWindow.rootViewController = nil; + self.messageActionsViewController = nil; + + [self ensureWindowState]; +} + +#pragma mark - Calls + - (void)setCallViewController:(nullable UIViewController *)callViewController { OWSAssertIsOnMainThread(); @@ -309,6 +353,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) [self ensureRootWindowHidden]; [self ensureReturnToCallWindowHidden]; [self ensureCallViewWindowHidden]; + [self ensureMessageActionsWindowHidden]; [self ensureScreenBlockWindowShown]; } else if (self.callViewController && self.shouldShowCallView) { // Show Call View. @@ -316,6 +361,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) [self ensureRootWindowHidden]; [self ensureReturnToCallWindowHidden]; [self ensureCallViewWindowShown]; + [self ensureMessageActionsWindowHidden]; [self ensureScreenBlockWindowHidden]; } else if (self.callViewController) { // Show Root Window + "Return to Call". @@ -323,6 +369,14 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) [self ensureRootWindowShown]; [self ensureReturnToCallWindowShown]; [self ensureCallViewWindowHidden]; + [self ensureMessageActionsWindowHidden]; + [self ensureScreenBlockWindowHidden]; + } else if (self.messageActionsViewController) { + + [self ensureRootWindowHidden]; + [self ensureReturnToCallWindowHidden]; + [self ensureCallViewWindowHidden]; + [self ensureMessageActionsWindowShown]; [self ensureScreenBlockWindowHidden]; } else { // Show Root Window @@ -330,6 +384,7 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) [self ensureRootWindowShown]; [self ensureReturnToCallWindowHidden]; [self ensureCallViewWindowHidden]; + [self ensureMessageActionsWindowHidden]; [self ensureScreenBlockWindowHidden]; } } @@ -407,6 +462,29 @@ const UIWindowLevel UIWindowLevel_ScreenBlocking(void) self.callViewWindow.hidden = YES; } +- (void)ensureMessageActionsWindowShown +{ + OWSAssertIsOnMainThread(); + + if (self.messageActionsWindow.hidden) { + DDLogInfo(@"%@ showing message actions window.", self.logTag); + } + + // Do not make key, we want the keyboard to stay popped. + self.messageActionsWindow.hidden = NO; +} + +- (void)ensureMessageActionsWindowHidden +{ + OWSAssertIsOnMainThread(); + + if (!self.messageActionsWindow.hidden) { + DDLogInfo(@"%@ hiding message actions window.", self.logTag); + } + + self.messageActionsWindow.hidden = YES; +} + - (void)ensureScreenBlockWindowShown { OWSAssertIsOnMainThread();