diff --git a/Source/OEXMyVideosSubSectionViewController.m b/Source/OEXMyVideosSubSectionViewController.m index 996768f56c..b4bb04cfdc 100644 --- a/Source/OEXMyVideosSubSectionViewController.m +++ b/Source/OEXMyVideosSubSectionViewController.m @@ -21,7 +21,6 @@ #import "OEXDateFormatting.h" #import "OEXInterface.h" #import "OEXHelperVideoDownload.h" -#import "OEXStatusMessageViewController.h" #import "OEXStyles.h" #import "OEXUserDetails.h" #import "OEXVideoPathEntry.h" @@ -47,7 +46,7 @@ typedef NS_ENUM (NSUInteger, OEXAlertType) { OEXAlertTypePlayBackContentUnAvailable }; -@interface OEXMyVideosSubSectionViewController () +@interface OEXMyVideosSubSectionViewController () { NSIndexPath* clickedIndexpath; } @@ -81,16 +80,6 @@ @interface OEXMyVideosSubSectionViewController () - -NS_ASSUME_NONNULL_BEGIN - -@class OEXStatusMessageViewController; -@class OEXTextStyle; - -extern CGFloat const OEXStatusMessagePadding; - -@protocol OEXStatusMessageControlling - -/// How far below the view origin the status message should be displayed -/// Typically this is the height of the navigation bar (including status bar), -/// but may also, for example, include a tab bar -- (CGFloat)verticalOffsetForStatusController:(OEXStatusMessageViewController*)controller; - -// Similarly, most of these views are from the navigation bar, so if we're using the system navigation bar -// These will just naturally go under that. For the tab bar, if we factor each tab to be a separate controller -// as they should be, these will naturally be zero - -/// Views that show be *over* the status message. Typically navigation related views -- (NSArray*)overlayViewsForStatusController:(OEXStatusMessageViewController*)controller; - -@end - -// DEPRECATED. Instead use the helpers in UIViewController+Overlay.swift -@interface OEXStatusMessageViewController : UIViewController - -+ (instancetype)sharedInstance; - -+ (OEXTextStyle*)statusMessageStyle; - -- (void)showMessage:(NSString*)message onViewController:(UIViewController *)controller; - -@property (readonly, nonatomic) BOOL isVisible; - -@end - -// Should only be used from within unit tests -@interface OEXStatusMessageViewController (Testing) - -- (BOOL)t_doesMessageTextFit; -- (BOOL)t_isStatusViewBelowView:(UIView*)view; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Source/OEXStatusMessageViewController.m b/Source/OEXStatusMessageViewController.m deleted file mode 100644 index cd536fd053..0000000000 --- a/Source/OEXStatusMessageViewController.m +++ /dev/null @@ -1,142 +0,0 @@ -// -// OEXStatusMessageViewController.m -// edXVideoLocker -// -// Created by Rahul Varma on 28/05/14. -// Copyright (c) 2014 edX. All rights reserved. -// - -#import "OEXStatusMessageViewController.h" - -#import "OEXTextStyle.h" - -CGFloat const OEXStatusMessagePadding = 20; - -@interface OEXStatusMessageViewController () - -@property (strong, nonatomic) IBOutlet UILabel* statusLabel; -@property (nonatomic, assign) CGFloat messageY; - -@end - -@implementation OEXStatusMessageViewController - -+ (id)sharedInstance { - static OEXStatusMessageViewController* sharedController = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedController = [[OEXStatusMessageViewController alloc] init]; - }); - - return sharedController; -} - -+ (OEXTextStyle*)statusMessageStyle { - OEXMutableTextStyle* style = [[OEXMutableTextStyle alloc] initWithWeight:OEXTextWeightNormal size:OEXTextSizeBase color:[UIColor whiteColor]]; - style.alignment = NSTextAlignmentCenter; - style.lineBreakMode = NSLineBreakByWordWrapping; - return style; -} - -- (CGFloat)labelPadding { - return OEXStatusMessagePadding * 2; // one for each side -} - -#pragma mark Public Actions - -- (void)showMessage:(NSString*)message onViewController:(UIViewController *)controller { - //Remove previous instance and animation - [self.view removeFromSuperview]; - [NSObject cancelPreviousPerformRequestsWithTarget:self]; - - (void)self.view; // ensure view is loaded - - //Pass data - self.statusLabel.attributedText = [[[self class] statusMessageStyle] attributedStringWithText: message]; - - CGFloat height = ceil([self.statusLabel sizeThatFits:CGSizeMake(controller.view.bounds.size.width - [self labelPadding], CGFLOAT_MAX)].height); - height += [self labelPadding]; // top + bottom - - self.view.frame = CGRectMake(0, - -height, - controller.view.bounds.size.width, - height); - - NSArray* overlayViews = [controller overlayViewsForStatusController:self] ? : @[]; - - // Unfortunately, because of the way our nav bars are set up (as part of the controller, instead of - // in a containing UINavigationController), we need to ensure that those views are at the top of the view - // ordering, so that we can put the status message under them. This floats them all to the top - // while maintaining their ordering - overlayViews = [overlayViews sortedArrayUsingComparator:^NSComparisonResult (UIView* view1, UIView* view2) { - return [@([controller.view.subviews indexOfObject:view1])compare : @([controller.view.subviews indexOfObject:view2])]; - }]; - - for(UIView* overlay in overlayViews) { - [controller.view bringSubviewToFront:overlay]; - } - - if(overlayViews.count == 0) { - [controller.view addSubview:self.view]; - } - else { - [controller.view insertSubview:self.view belowSubview:overlayViews.firstObject]; - } - - self.messageY = [controller verticalOffsetForStatusController:self]; - - //Animate - [self animationDrop]; -} - -#pragma mark Animation - -- (void)animationDrop { - [UIView animateWithDuration:ANI_DURATION - delay:0.0 - usingSpringWithDamping:1.0 - initialSpringVelocity:0.1 - options:UIViewAnimationOptionCurveEaseIn - animations:^{ - self.view.frame = CGRectMake(0, - _messageY, - self.view.frame.size.width, - self.view.frame.size.height); - } completion:^(BOOL finished) { - [self performSelector:@selector(animationUp) withObject:nil afterDelay:ANI_ERROR_TIMEOUT]; - }]; -} - -- (void)animationUp { - [UIView animateWithDuration:ANI_DURATION - delay:0.0 - usingSpringWithDamping:1.0 - initialSpringVelocity:0.1 - options:UIViewAnimationOptionCurveEaseOut - animations:^{ - CGFloat height = self.view.frame.size.height; - self.view.frame = CGRectMake(0, -height, self.view.frame.size.width, height); - } completion:nil]; -} - -- (BOOL)isVisible { - return self.isViewLoaded && self.view.window != nil; -} - -@end - -@implementation OEXStatusMessageViewController (Testing) - -- (BOOL)t_doesMessageTextFit { - CGRect bounds = self.statusLabel.bounds; - CGSize size = [self.statusLabel sizeThatFits:CGSizeMake(bounds.size.width, CGFLOAT_MAX)]; - return ceil(size.height + [self labelPadding]) == ceil(bounds.size.height) && self.view.bounds.size.width == self.view.superview.bounds.size.width; -} - -- (BOOL)t_isStatusViewBelowView:(UIView*)view { - NSInteger statusIndex = [self.view.superview.subviews indexOfObject:self.view]; - NSInteger viewIndex = [self.view.superview.subviews indexOfObject:view]; - return statusIndex < viewIndex; -} - -@end \ No newline at end of file diff --git a/Source/OEXStatusMessageViewController.xib b/Source/OEXStatusMessageViewController.xib deleted file mode 100644 index bfd7018d0f..0000000000 --- a/Source/OEXStatusMessageViewController.xib +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/UIViewController+Overlay.swift b/Source/UIViewController+Overlay.swift index 8efb194af5..77218f7480 100644 --- a/Source/UIViewController+Overlay.swift +++ b/Source/UIViewController+Overlay.swift @@ -26,7 +26,7 @@ private class StatusMessageView : UIView { addSubview(messageLabel) self.backgroundColor = OEXStyles.sharedStyles().neutralDark().colorWithAlphaComponent(0.75) - messageLabel.attributedText = OEXStatusMessageViewController.statusMessageStyle().attributedStringWithText(message) + messageLabel.attributedText = statusMessageStyle.attributedStringWithText(message) messageLabel.snp_makeConstraints { make in make.top.equalTo(self).offset(margin) make.leading.equalTo(self).offset(margin) @@ -38,6 +38,14 @@ private class StatusMessageView : UIView { required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + private var statusMessageStyle: OEXMutableTextStyle { + let style = OEXMutableTextStyle(weight: .Normal, size: .Base, color: UIColor.whiteColor()) + style.alignment = .Center; + style.lineBreakMode = NSLineBreakMode.ByWordWrapping; + return style; + + } } private let visibleDuration: NSTimeInterval = 5.0 diff --git a/Source/edX-Bridging-Header.h b/Source/edX-Bridging-Header.h index 4e973d4590..d87b3a378a 100644 --- a/Source/edX-Bridging-Header.h +++ b/Source/edX-Bridging-Header.h @@ -48,7 +48,6 @@ #import "OEXRemovable.h" #import "OEXRouter.h" #import "OEXSession.h" -#import "OEXStatusMessageViewController.h" #import "OEXStyles.h" #import "OEXTextStyle.h" #import "OEXSwitchStyle.h" diff --git a/Test/OEXStatusMessageViewControllerTests.m b/Test/OEXStatusMessageViewControllerTests.m deleted file mode 100644 index 1e86193f27..0000000000 --- a/Test/OEXStatusMessageViewControllerTests.m +++ /dev/null @@ -1,96 +0,0 @@ -// -// OEXStatusMessageViewControllerTests.m -// edXVideoLocker -// -// Created by Akiva Leffert on 3/18/15. -// Copyright (c) 2015 edX. All rights reserved. -// - -#import -#import - -#import "NSString+TestExamples.h" - -#import "OEXStatusMessageViewController.h" - -@interface OEXStatusMessageTestController : UIViewController - -@property (copy, nonatomic) NSArray* overlayViews; - -@end - -@implementation OEXStatusMessageTestController - -- (CGFloat)verticalOffsetForStatusController:(OEXStatusMessageViewController *)controller { - return 0; -} - -- (NSArray*)overlayViewsForStatusController:(OEXStatusMessageViewController *)controller { - return self.overlayViews; -} - -@end - -@interface OEXStatusMessageViewControllerTests : XCTestCase - -@end - -@implementation OEXStatusMessageViewControllerTests - -- (void)testRegularMessage { - OEXStatusMessageViewController* statusController = [[OEXStatusMessageViewController alloc] initWithNibName:nil bundle:nil]; - OEXStatusMessageTestController* testController = [[OEXStatusMessageTestController alloc] initWithNibName:nil bundle:nil]; - testController.view.frame = CGRectMake(0, 0, 300, 500); - [statusController showMessage:@"test" onViewController:testController]; - XCTAssertTrue([statusController t_doesMessageTextFit]); -} - - -- (void)testLongMessage { - OEXStatusMessageViewController* statusController = [[OEXStatusMessageViewController alloc] initWithNibName:nil bundle:nil]; - OEXStatusMessageTestController* testController = [[OEXStatusMessageTestController alloc] initWithNibName:nil bundle:nil]; - testController.view.frame = CGRectMake(0, 0, 300, 500); - [statusController showMessage:[NSString oex_longTestString] onViewController:testController]; - XCTAssertTrue([statusController t_doesMessageTextFit]); -} - -- (void)testOverlay { - OEXStatusMessageViewController* statusController = [[OEXStatusMessageViewController alloc] initWithNibName:nil bundle:nil]; - OEXStatusMessageTestController* testController = [[OEXStatusMessageTestController alloc] initWithNibName:nil bundle:nil]; - testController.view.frame = CGRectMake(0, 0, 300, 500); - - UIView* subview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; - [testController.view addSubview:subview]; - - UIView* overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; - [testController.view addSubview:overlayView]; - testController.overlayViews = @[overlayView]; - - [statusController showMessage:@"test" onViewController:testController]; - XCTAssertFalse([statusController t_isStatusViewBelowView:subview]); - XCTAssertTrue([statusController t_isStatusViewBelowView:overlayView]); -} - -- (void)testStableOrdering { - OEXStatusMessageViewController* statusController = [[OEXStatusMessageViewController alloc] initWithNibName:nil bundle:nil]; - OEXStatusMessageTestController* testController = [[OEXStatusMessageTestController alloc] initWithNibName:nil bundle:nil]; - testController.view.frame = CGRectMake(0, 0, 300, 500); - - UIView* subview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; - [testController.view addSubview:subview]; - - UIView* overlayView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; - [testController.view addSubview:overlayView1]; - - UIView* overlayView2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; - [testController.view addSubview:overlayView2]; - testController.overlayViews = @[overlayView2, overlayView1]; - - [statusController showMessage:@"test" onViewController:testController]; - XCTAssertFalse([statusController t_isStatusViewBelowView:subview]); - XCTAssertTrue([statusController t_isStatusViewBelowView:overlayView1]); - XCTAssertTrue([statusController t_isStatusViewBelowView:overlayView2]); - XCTAssertLessThan([testController.view.subviews indexOfObject:overlayView1], [testController.view.subviews indexOfObject:overlayView2]); -} - -@end diff --git a/edX.xcodeproj/project.pbxproj b/edX.xcodeproj/project.pbxproj index 60917440df..a3dc30d39b 100644 --- a/edX.xcodeproj/project.pbxproj +++ b/edX.xcodeproj/project.pbxproj @@ -378,7 +378,6 @@ 7772BEAC1AFA68330081CA7A /* View+SnapKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7772BEA11AFA68330081CA7A /* View+SnapKit.swift */; }; 7772BEB21AFA6C0F0081CA7A /* FontAwesome.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7772BEB11AFA6C0F0081CA7A /* FontAwesome.swift */; }; 7773D1A91B1E557D0037214B /* OEXVideoEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 7773D1A81B1E557D0037214B /* OEXVideoEncoding.m */; }; - 7778F0931ABA1F8000B4CDA0 /* OEXStatusMessageViewControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7778F0921ABA1F8000B4CDA0 /* OEXStatusMessageViewControllerTests.m */; }; 7778F0951ABA2C3600B4CDA0 /* OEXRegistrationFieldEmailViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7778F0941ABA2C3600B4CDA0 /* OEXRegistrationFieldEmailViewTests.m */; }; 7778F0981ABB1A6C00B4CDA0 /* NSError+OEXKnownErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 7778F0971ABB1A6C00B4CDA0 /* NSError+OEXKnownErrors.m */; }; 777DE7141C1630110068E280 /* CourseMediaInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 777DE7131C1630110068E280 /* CourseMediaInfo.swift */; }; @@ -659,8 +658,6 @@ BECB7B5A1924D760009C77F1 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BECB7B591924D760009C77F1 /* SWRevealViewController.m */; }; BECB7B691924EE11009C77F1 /* OEXLoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BECB7B681924EE11009C77F1 /* OEXLoginViewController.m */; }; BEEEBF80196AAACF00EF2C35 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = BEEEBF82196AAACF00EF2C35 /* Localizable.strings */; }; - BEEEBF87196AB7EA00EF2C35 /* OEXStatusMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BEEEBF85196AB7EA00EF2C35 /* OEXStatusMessageViewController.m */; }; - BEEEBF88196AB7EA00EF2C35 /* OEXStatusMessageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BEEEBF86196AB7EA00EF2C35 /* OEXStatusMessageViewController.xib */; }; DC4DF62530E533B021DE5F00 /* libPods-edX.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A2AAE7DB51F8E01CE137D8E /* libPods-edX.a */; }; E00523431CF81D9800B7F5C3 /* DiscussionBlockViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00523421CF81D9800B7F5C3 /* DiscussionBlockViewController.swift */; }; E00523451CFD768700B7F5C3 /* DiscussionBlockViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E00523441CFD768700B7F5C3 /* DiscussionBlockViewControllerTests.swift */; }; @@ -1193,7 +1190,6 @@ 7772BEB11AFA6C0F0081CA7A /* FontAwesome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FontAwesome.swift; path = Libraries/FontAwesome.swift/Classes/FontAwesome.swift; sourceTree = SOURCE_ROOT; }; 7773D1A71B1E557D0037214B /* OEXVideoEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OEXVideoEncoding.h; sourceTree = ""; }; 7773D1A81B1E557D0037214B /* OEXVideoEncoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OEXVideoEncoding.m; sourceTree = ""; }; - 7778F0921ABA1F8000B4CDA0 /* OEXStatusMessageViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OEXStatusMessageViewControllerTests.m; sourceTree = ""; }; 7778F0941ABA2C3600B4CDA0 /* OEXRegistrationFieldEmailViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OEXRegistrationFieldEmailViewTests.m; sourceTree = ""; }; 7778F0961ABB1A6C00B4CDA0 /* NSError+OEXKnownErrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+OEXKnownErrors.h"; sourceTree = ""; }; 7778F0971ABB1A6C00B4CDA0 /* NSError+OEXKnownErrors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+OEXKnownErrors.m"; sourceTree = ""; }; @@ -1559,9 +1555,6 @@ BECB7B591924D760009C77F1 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; BECB7B671924EE11009C77F1 /* OEXLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OEXLoginViewController.h; sourceTree = ""; }; BECB7B681924EE11009C77F1 /* OEXLoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OEXLoginViewController.m; sourceTree = ""; }; - BEEEBF84196AB7EA00EF2C35 /* OEXStatusMessageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OEXStatusMessageViewController.h; sourceTree = ""; }; - BEEEBF85196AB7EA00EF2C35 /* OEXStatusMessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OEXStatusMessageViewController.m; sourceTree = ""; }; - BEEEBF86196AB7EA00EF2C35 /* OEXStatusMessageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OEXStatusMessageViewController.xib; sourceTree = ""; }; E00523421CF81D9800B7F5C3 /* DiscussionBlockViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionBlockViewController.swift; sourceTree = ""; }; E00523441CFD768700B7F5C3 /* DiscussionBlockViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionBlockViewControllerTests.swift; sourceTree = ""; }; E008D9041CCE1506007F3643 /* DiscussionResponsesViewControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiscussionResponsesViewControllerTests.swift; sourceTree = ""; }; @@ -1802,8 +1795,6 @@ 77FDF4181B02910D00E8C639 /* IconMessageView.swift */, 199B9B771935EA8000081A09 /* OEXFlowErrorViewController.h */, 199B9B781935EA8000081A09 /* OEXFlowErrorViewController.m */, - BEEEBF84196AB7EA00EF2C35 /* OEXStatusMessageViewController.h */, - BEEEBF85196AB7EA00EF2C35 /* OEXStatusMessageViewController.m */, ); name = ErrorView; sourceTree = ""; @@ -2430,7 +2421,6 @@ 198826E71952FE39005D4D8A /* OEXOpenInBrowserViewController.xib */, B4B6D5E81A9490FC000F44E8 /* OEXRegistrationViewController.xib */, B4B6D6471A95CF33000F44E8 /* OEXUserLicenseAgreementViewController.xib */, - BEEEBF86196AB7EA00EF2C35 /* OEXStatusMessageViewController.xib */, 9E7D1BCB1AEA5BF5000AF768 /* OEXDownloadViewController.storyboard */, 9ED269C91AF0D62B00328A34 /* OEXMyVideosSubSectionViewController.storyboard */, 9ED269CB1AF0E67200328A34 /* OEXMyVideosViewController.storyboard */, @@ -3200,7 +3190,6 @@ 770A27AB1A702B6500DFC6FF /* OEXDataParserTests.m */, 9E35A2831B32D7090040B9A9 /* DateFormattingTests.swift */, 194E01901A54204A00A0CFAE /* OEXFormEncodingTests.m */, - 7778F0921ABA1F8000B4CDA0 /* OEXStatusMessageViewControllerTests.m */, 77A340201AB2461800C8E141 /* OEXRegistrationViewControllerTests.m */, 8F7F6DAC1A795AA60063B9D6 /* OEXSessionTests.m */, 770A279E1A6F164800DFC6FF /* OEXVideoPathEntryTests.m */, @@ -3579,7 +3568,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BEEEBF88196AB7EA00EF2C35 /* OEXStatusMessageViewController.xib in Resources */, 69ECC6151D50D1170030CF87 /* bt_facebook.png in Resources */, 69ECC6171D50D1170030CF87 /* bt_google.png in Resources */, 9ED269CA1AF0D62B00328A34 /* OEXMyVideosSubSectionViewController.storyboard in Resources */, @@ -4212,7 +4200,6 @@ B498405A19753C6C00019D1F /* CLVideoPlayerControls.m in Sources */, B4B6D6311A949F71000F44E8 /* OEXRegistrationFieldControllerFactory.m in Sources */, 7773D1A91B1E557D0037214B /* OEXVideoEncoding.m in Sources */, - BEEEBF87196AB7EA00EF2C35 /* OEXStatusMessageViewController.m in Sources */, 77092C731B421BD0004AA1A1 /* ContainerNavigationController.swift in Sources */, B4132C10195AAFBE00F50B46 /* OEXAuthentication.m in Sources */, 775EB3AE1B1FF1AD009526A8 /* ButtonStyle.swift in Sources */, @@ -4362,7 +4349,6 @@ 77FFA2C31AC30C1500B4D69B /* NSAttributedString+OEXFormattingTests.m in Sources */, 77000A391A76EFF2007D306C /* NSString+OEXValidationTests.m in Sources */, F2586E061CF5F8C7007C1118 /* NetworkManager+AuthenticatorTests.swift in Sources */, - 7778F0931ABA1F8000B4CDA0 /* OEXStatusMessageViewControllerTests.m in Sources */, 194E01931A54204B00A0CFAE /* OEXFormEncodingTests.m in Sources */, 775EB3AA1B1FBF58009526A8 /* CourseOutlineHeaderViewTests.swift in Sources */, 773181441B7066E5000CC050 /* DiscussionNewPostViewControllerTests.swift in Sources */,