From 27e5a2f1b2470b3fbb9a559c45c60f985f9a7f61 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 26 Sep 2017 12:37:00 -0400 Subject: [PATCH] Sketch out GIF picker. // FREEBIE --- Signal.xcodeproj/project.pbxproj | 4 + .../Contents.json | 23 + .../actionsheet_gif_black@1x.png | Bin 0 -> 1555 bytes .../actionsheet_gif_black@2x.png | Bin 0 -> 2148 bytes .../actionsheet_gif_black@3x.png | Bin 0 -> 2536 bytes .../ConversationViewController.m | 25 + .../GifPickerViewController.swift | 535 ++++++++++++++++++ 7 files changed, 587 insertions(+) create mode 100644 Signal/Images.xcassets/actionsheet_gif_black.imageset/Contents.json create mode 100644 Signal/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png create mode 100644 Signal/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@2x.png create mode 100644 Signal/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@3x.png create mode 100644 Signal/src/ViewControllers/GifPickerViewController.swift diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 53cc51c4c..871e98a3d 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 340CB2241EAC155C0001CAA1 /* ContactsViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */; }; 340CB2271EAC25820001CAA1 /* UpdateGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340CB2261EAC25820001CAA1 /* UpdateGroupViewController.m */; }; 341207271EE19F6A00463194 /* OWSSystemMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 341207261EE19F6A00463194 /* OWSSystemMessageCell.m */; }; + 341B057C1F78A3B5007D3F7A /* GifPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 341B057B1F78A3B5007D3F7A /* GifPickerViewController.swift */; }; 341BB7491DB727EE001E2975 /* JSQMediaItem+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */; }; 341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */ = {isa = PBXBuildFile; fileRef = 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */; }; 342FCE6B1EF9C375002690AD /* OWS105AttachmentFilePaths.m in Sources */ = {isa = PBXBuildFile; fileRef = 342FCE6A1EF9C375002690AD /* OWS105AttachmentFilePaths.m */; }; @@ -413,6 +414,7 @@ 340CB2261EAC25820001CAA1 /* UpdateGroupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UpdateGroupViewController.m; sourceTree = ""; }; 341207251EE19F6A00463194 /* OWSSystemMessageCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OWSSystemMessageCell.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 341207261EE19F6A00463194 /* OWSSystemMessageCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = OWSSystemMessageCell.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 341B057B1F78A3B5007D3F7A /* GifPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GifPickerViewController.swift; sourceTree = ""; }; 341BB7471DB727EE001E2975 /* JSQMediaItem+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSQMediaItem+OWS.h"; sourceTree = ""; }; 341BB7481DB727EE001E2975 /* JSQMediaItem+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSQMediaItem+OWS.m"; sourceTree = ""; }; 341F2C0D1F2B8AE700D07D6B /* DebugUIMisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugUIMisc.h; sourceTree = ""; }; @@ -1030,6 +1032,7 @@ 34E8BF371EE9E2FD00F5F4CA /* FingerprintViewScanController.m */, 34B3F8471E8DF1700035BE1A /* FullImageViewController.h */, 34B3F8481E8DF1700035BE1A /* FullImageViewController.m */, + 341B057B1F78A3B5007D3F7A /* GifPickerViewController.swift */, 34B3F86F1E8DF1700035BE1A /* HomeViewController.h */, 34B3F8701E8DF1700035BE1A /* HomeViewController.m */, 34B3F8491E8DF1700035BE1A /* InboxTableViewCell.h */, @@ -2209,6 +2212,7 @@ 34D99C931F2937CC00D284D6 /* OWSAnalytics.swift in Sources */, 34D9134B1F62D4A500722898 /* SignalAttachment.swift in Sources */, 34B3F88E1E8DF1700035BE1A /* PrivacySettingsTableViewController.m in Sources */, + 341B057C1F78A3B5007D3F7A /* GifPickerViewController.swift in Sources */, 4505C2C21E648F7A00CEBF41 /* ExperienceUpgradeFinder.swift in Sources */, 341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */, 34E3EF0D1EFC235B007F6822 /* DebugUIDiskUsage.m in Sources */, diff --git a/Signal/Images.xcassets/actionsheet_gif_black.imageset/Contents.json b/Signal/Images.xcassets/actionsheet_gif_black.imageset/Contents.json new file mode 100644 index 000000000..07f092273 --- /dev/null +++ b/Signal/Images.xcassets/actionsheet_gif_black.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "actionsheet_gif_black@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "actionsheet_gif_black@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "actionsheet_gif_black@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png b/Signal/Images.xcassets/actionsheet_gif_black.imageset/actionsheet_gif_black@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..b10ce2276350e29387a5f28a458f10f21886bc0b GIT binary patch literal 1555 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 F{{og!_^|*0 literal 0 HcmV?d00001 diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index a724ce115..bb5a7bc80 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -3203,6 +3203,15 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { [self presentViewController:menuController animated:YES completion:nil]; } +#pragma mark - Attachment Picking: GIFs + +- (void)showGifPicker +{ + GifPickerViewController *view = [GifPickerViewController new]; + UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:view]; + [self presentViewController:navigationController animated:YES completion:nil]; +} + #pragma mark UIDocumentMenuDelegate - (void)documentMenu:(UIDocumentMenuViewController *)documentMenu @@ -4042,6 +4051,22 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { [chooseDocumentAction setValue:chooseDocumentImage forKey:@"image"]; [actionSheetController addAction:chooseDocumentAction]; +#ifdef DEBUG + UIAlertAction *gifAction = + // TODO: + [UIAlertAction actionWithTitle:NSLocalizedString(@"SELECT_GIF_BUTTON", + @"Label for 'select gif to attach' action sheet button") + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *_Nonnull action) { + [self showGifPicker]; + }]; + // TODO: + UIImage *gifImage = [UIImage imageNamed:@"actionsheet_gif_black"]; + OWSAssert(gifImage); + [gifAction setValue:gifImage forKey:@"image"]; + [actionSheetController addAction:gifAction]; +#endif + [self presentViewController:actionSheetController animated:true completion:nil]; } diff --git a/Signal/src/ViewControllers/GifPickerViewController.swift b/Signal/src/ViewControllers/GifPickerViewController.swift new file mode 100644 index 000000000..9facce45d --- /dev/null +++ b/Signal/src/ViewControllers/GifPickerViewController.swift @@ -0,0 +1,535 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +import Foundation +//import MediaPlayer + +class GifPickerViewController: OWSViewController, UISearchBarDelegate +//, OWSAudioAttachmentPlayerDelegate +{ + let TAG = "[GifPickerViewController]" + + // MARK: Properties + + let searchBar: UISearchBar + let collectionView: UICollectionView + +// let attachment: SignalAttachment +// +// var successCompletion : (() -> Void)? +// +// var videoPlayer: MPMoviePlayerController? +// +// var audioPlayer: OWSAudioAttachmentPlayer? +// var audioStatusLabel: UILabel? +// var audioPlayButton: UIButton? +// var isAudioPlayingFlag = false +// var isAudioPaused = false +// var audioProgressSeconds: CGFloat = 0 +// var audioDurationSeconds: CGFloat = 0 + + // MARK: Initializers + + @available(*, unavailable, message:"use attachment: constructor instead.") + required init?(coder aDecoder: NSCoder) { + self.searchBar = UISearchBar() + self.collectionView = UICollectionView() +// self.attachment = SignalAttachment.empty() + super.init(coder: aDecoder) + owsFail("\(self.TAG) invalid constructor") + } + + required init() { + self.searchBar = UISearchBar() + self.collectionView = UICollectionView() +// assert(!attachment.hasError) +// self.attachment = attachment +// self.successCompletion = successCompletion + super.init(nibName: nil, bundle: nil) + } + + // MARK: View Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = UIColor.white + + self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem:.stop, + target:self, + action:#selector(donePressed)) + self.navigationItem.title = NSLocalizedString("GIF_PICKER_VIEW_TITLE", + comment: "Title for the 'gif picker' dialog.") + + createViews() + } + + // MARK: Views + + private func createViews() { +// @property (nonatomic, readonly) UISearchBar *searchBar; + + view.backgroundColor = UIColor.white + + // Search + searchBar.searchBarStyle = .minimal + searchBar.delegate = self + searchBar.placeholder = NSLocalizedString("GIF_VIEW_SEARCH_PLACEHOLDER_TEXT", + comment:"Placeholder text for the search field in gif view") + searchBar.backgroundColor = UIColor.white + self.view.addSubview(searchBar) + searchBar.autoPinWidthToSuperview() + searchBar.autoPin(toTopLayoutGuideOf: self, withInset:0) +// [searchBar sizeToFit]; + +// _tableViewController = [OWSTableViewController new]; +// _tableViewController.delegate = self; +// _tableViewController.tableViewStyle = UITableViewStylePlain; +// [self.view addSubview:self.tableViewController.view]; +// [_tableViewController.view autoPinWidthToSuperview]; +// +// [_tableViewController.view autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:contactsPermissionReminderView]; +// [_tableViewController.view autoPinToBottomLayoutGuideOfViewController:self withInset:0]; +// _tableViewController.tableView.tableHeaderView = searchBar; +// +// _noSignalContactsView = [self createNoSignalContactsView]; +// self.noSignalContactsView.hidden = YES; +// [self.view addSubview:self.noSignalContactsView]; +// [self.noSignalContactsView autoPinWidthToSuperview]; +// [self.noSignalContactsView autoPinEdgeToSuperviewEdge:ALEdgeTop]; +// [self.noSignalContactsView autoPinToBottomLayoutGuideOfViewController:self withInset:0]; +// +// UIRefreshControl *pullToRefreshView = [UIRefreshControl new]; +// pullToRefreshView.tintColor = [UIColor grayColor]; +// [pullToRefreshView addTarget:self +// action:@selector(pullToRefreshPerformed:) +// forControlEvents:UIControlEventValueChanged]; +// [self.tableViewController.tableView insertSubview:pullToRefreshView atIndex:0]; +// +// [self updateTableContents]; + } + +// override func viewDidLoad() { +// super.viewDidLoad() +// +// view.backgroundColor = UIColor.white +// +// self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem:.stop, +// target:self, +// action:#selector(donePressed)) +// self.navigationItem.title = dialogTitle() +// +// createViews() +// } +// +// private func dialogTitle() -> String { +// guard let filename = formattedFileName() else { +// return NSLocalizedString("ATTACHMENT_APPROVAL_DIALOG_TITLE", +// comment: "Title for the 'attachment approval' dialog.") +// } +// return filename +// } +// +// override func viewWillAppear(_ animated: Bool) { +// super.viewWillAppear(animated) +// +// ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(true) +// } +// +// override func viewWillDisappear(_ animated: Bool) { +// super.viewWillDisappear(animated) +// +// ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(false) +// } +// +// // MARK: - Create Views +// +// private func createViews() { +// let previewTopMargin: CGFloat = 30 +// let previewHMargin: CGFloat = 20 +// +// let attachmentPreviewView = UIView() +// self.view.addSubview(attachmentPreviewView) +// attachmentPreviewView.autoPinWidthToSuperview(withMargin:previewHMargin) +// attachmentPreviewView.autoPin(toTopLayoutGuideOf: self, withInset:previewTopMargin) +// +// createButtonRow(attachmentPreviewView:attachmentPreviewView) +// +// if attachment.isAnimatedImage { +// createAnimatedPreview(attachmentPreviewView:attachmentPreviewView) +// } else if attachment.isImage { +// createImagePreview(attachmentPreviewView:attachmentPreviewView) +// } else if attachment.isVideo { +// createVideoPreview(attachmentPreviewView:attachmentPreviewView) +// } else if attachment.isAudio { +// createAudioPreview(attachmentPreviewView:attachmentPreviewView) +// } else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// } +// } +// +// private func wrapViewsInVerticalStack(subviews: [UIView]) -> UIView { +// assert(subviews.count > 0) +// +// let stackView = UIView() +// +// var lastView: UIView? +// for subview in subviews { +// +// stackView.addSubview(subview) +// subview.autoHCenterInSuperview() +// +// if lastView == nil { +// subview.autoPinEdge(toSuperviewEdge:.top) +// } else { +// subview.autoPinEdge(.top, to:.bottom, of:lastView!, withOffset:10) +// } +// +// lastView = subview +// } +// +// lastView?.autoPinEdge(toSuperviewEdge:.bottom) +// +// return stackView +// } +// +// private func createAudioPreview(attachmentPreviewView: UIView) { +// guard let dataUrl = attachment.dataUrl else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// return +// } +// +// audioPlayer = OWSAudioAttachmentPlayer(mediaUrl: dataUrl, delegate: self) +// +// var subviews = [UIView]() +// +// let audioPlayButton = UIButton() +// self.audioPlayButton = audioPlayButton +// setAudioIconToPlay() +// audioPlayButton.imageView?.layer.minificationFilter = kCAFilterTrilinear +// audioPlayButton.imageView?.layer.magnificationFilter = kCAFilterTrilinear +// audioPlayButton.addTarget(self, action:#selector(audioPlayButtonPressed), for:.touchUpInside) +// let buttonSize = createHeroViewSize() +// audioPlayButton.autoSetDimension(.width, toSize:buttonSize) +// audioPlayButton.autoSetDimension(.height, toSize:buttonSize) +// subviews.append(audioPlayButton) +// +// let fileNameLabel = createFileNameLabel() +// if let fileNameLabel = fileNameLabel { +// subviews.append(fileNameLabel) +// } +// +// let fileSizeLabel = createFileSizeLabel() +// subviews.append(fileSizeLabel) +// +// let audioStatusLabel = createAudioStatusLabel() +// self.audioStatusLabel = audioStatusLabel +// updateAudioStatusLabel() +// subviews.append(audioStatusLabel) +// +// let stackView = wrapViewsInVerticalStack(subviews:subviews) +// attachmentPreviewView.addSubview(stackView) +// fileNameLabel?.autoPinWidthToSuperview(withMargin: 32) +// stackView.autoPinWidthToSuperview() +// stackView.autoVCenterInSuperview() +// } +// +// private func createAnimatedPreview(attachmentPreviewView: UIView) { +// guard attachment.isValidImage else { +// return +// } +// let data = attachment.data +// // Use Flipboard FLAnimatedImage library to display gifs +// guard let animatedImage = FLAnimatedImage(gifData:data) else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// return +// } +// let animatedImageView = FLAnimatedImageView() +// animatedImageView.animatedImage = animatedImage +// animatedImageView.contentMode = .scaleAspectFit +// attachmentPreviewView.addSubview(animatedImageView) +// animatedImageView.autoPinWidthToSuperview() +// animatedImageView.autoPinHeightToSuperview() +// } +// +// private func createImagePreview(attachmentPreviewView: UIView) { +// var image = attachment.image +// if image == nil { +// image = UIImage(data:attachment.data) +// } +// guard image != nil else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// return +// } +// +// let imageView = UIImageView(image:image) +// imageView.layer.minificationFilter = kCAFilterTrilinear +// imageView.layer.magnificationFilter = kCAFilterTrilinear +// imageView.contentMode = .scaleAspectFit +// attachmentPreviewView.addSubview(imageView) +// imageView.autoPinWidthToSuperview() +// imageView.autoPinHeightToSuperview() +// } +// +// private func createVideoPreview(attachmentPreviewView: UIView) { +// guard let dataUrl = attachment.dataUrl else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// return +// } +// guard let videoPlayer = MPMoviePlayerController(contentURL:dataUrl) else { +// createGenericPreview(attachmentPreviewView:attachmentPreviewView) +// return +// } +// videoPlayer.prepareToPlay() +// +// videoPlayer.controlStyle = .default +// videoPlayer.shouldAutoplay = false +// +// attachmentPreviewView.addSubview(videoPlayer.view) +// self.videoPlayer = videoPlayer +// videoPlayer.view.autoPinWidthToSuperview() +// videoPlayer.view.autoPinHeightToSuperview() +// } +// +// private func createGenericPreview(attachmentPreviewView: UIView) { +// var subviews = [UIView]() +// +// let imageView = createHeroImageView(imageName: "file-thin-black-filled-large") +// subviews.append(imageView) +// +// let fileNameLabel = createFileNameLabel() +// if let fileNameLabel = fileNameLabel { +// subviews.append(fileNameLabel) +// } +// +// let fileSizeLabel = createFileSizeLabel() +// subviews.append(fileSizeLabel) +// +// let stackView = wrapViewsInVerticalStack(subviews:subviews) +// attachmentPreviewView.addSubview(stackView) +// fileNameLabel?.autoPinWidthToSuperview(withMargin: 32) +// stackView.autoPinWidthToSuperview() +// stackView.autoVCenterInSuperview() +// } +// +// private func createHeroViewSize() -> CGFloat { +// return ScaleFromIPhone5To7Plus(175, 225) +// } +// +// private func createHeroImageView(imageName: String) -> UIView { +// let imageSize = createHeroViewSize() +// let image = UIImage(named:imageName) +// assert(image != nil) +// let imageView = UIImageView(image:image) +// imageView.layer.minificationFilter = kCAFilterTrilinear +// imageView.layer.magnificationFilter = kCAFilterTrilinear +// imageView.layer.shadowColor = UIColor.black.cgColor +// let shadowScaling = 5.0 +// imageView.layer.shadowRadius = CGFloat(2.0 * shadowScaling) +// imageView.layer.shadowOpacity = 0.25 +// imageView.layer.shadowOffset = CGSize(width: 0.75 * shadowScaling, height: 0.75 * shadowScaling) +// imageView.autoSetDimension(.width, toSize:imageSize) +// imageView.autoSetDimension(.height, toSize:imageSize) +// +// return imageView +// } +// +// private func labelFont() -> UIFont { +// return UIFont.ows_regularFont(withSize:ScaleFromIPhone5To7Plus(18, 24)) +// } +// +// private func formattedFileExtension() -> String? { +// guard let fileExtension = attachment.fileExtension else { +// return nil +// } +// +// return String(format:NSLocalizedString("ATTACHMENT_APPROVAL_FILE_EXTENSION_FORMAT", +// comment: "Format string for file extension label in call interstitial view"), +// fileExtension.uppercased()) +// } +// +// private func formattedFileName() -> String? { +// guard let sourceFilename = attachment.sourceFilename else { +// return nil +// } +// let filename = sourceFilename.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) +// guard filename.characters.count > 0 else { +// return nil +// } +// return filename +// } +// +// private func createFileNameLabel() -> UIView? { +// let filename = formattedFileName() ?? formattedFileExtension() +// +// guard filename != nil else { +// return nil +// } +// +// let label = UILabel() +// label.text = filename +// label.textColor = UIColor.ows_materialBlue() +// label.font = labelFont() +// label.textAlignment = .center +// label.lineBreakMode = .byTruncatingMiddle +// return label +// } +// +// private func createFileSizeLabel() -> UIView { +// let label = UILabel() +// let fileSize = attachment.dataLength +// label.text = String(format:NSLocalizedString("ATTACHMENT_APPROVAL_FILE_SIZE_FORMAT", +// comment: "Format string for file size label in call interstitial view. Embeds: {{file size as 'N mb' or 'N kb'}}."), +// ViewControllerUtils.formatFileSize(UInt(fileSize))) +// +// label.textColor = UIColor.ows_materialBlue() +// label.font = labelFont() +// label.textAlignment = .center +// +// return label +// } +// +// private func createAudioStatusLabel() -> UILabel { +// let label = UILabel() +// label.textColor = UIColor.ows_materialBlue() +// label.font = labelFont() +// label.textAlignment = .center +// +// return label +// } +// +// private func createButtonRow(attachmentPreviewView: UIView) { +// let buttonTopMargin = ScaleFromIPhone5To7Plus(30, 40) +// let buttonBottomMargin = ScaleFromIPhone5To7Plus(25, 40) +// let buttonHSpacing = ScaleFromIPhone5To7Plus(20, 30) +// +// let buttonRow = UIView() +// self.view.addSubview(buttonRow) +// buttonRow.autoPinWidthToSuperview() +// buttonRow.autoPinEdge(toSuperviewEdge:.bottom, withInset:buttonBottomMargin) +// buttonRow.autoPinEdge(.top, to:.bottom, of:attachmentPreviewView, withOffset:buttonTopMargin) +// +// // We use this invisible subview to ensure that the buttons are centered +// // horizontally. +// let buttonSpacer = UIView() +// buttonRow.addSubview(buttonSpacer) +// // Vertical positioning of this view doesn't matter. +// buttonSpacer.autoPinEdge(toSuperviewEdge:.top) +// buttonSpacer.autoSetDimension(.width, toSize:buttonHSpacing) +// buttonSpacer.autoHCenterInSuperview() +// +// let cancelButton = createButton(title: CommonStrings.cancelButton, +// color : UIColor.ows_destructiveRed(), +// action: #selector(cancelPressed)) +// buttonRow.addSubview(cancelButton) +// cancelButton.autoPinEdge(toSuperviewEdge:.top) +// cancelButton.autoPinEdge(toSuperviewEdge:.bottom) +// cancelButton.autoPinEdge(.right, to:.left, of:buttonSpacer) +// +// let sendButton = createButton(title: NSLocalizedString("ATTACHMENT_APPROVAL_SEND_BUTTON", +// comment: "Label for 'send' button in the 'attachment approval' dialog."), +// color : UIColor(rgbHex:0x2ecc71), +// action: #selector(sendPressed)) +// buttonRow.addSubview(sendButton) +// sendButton.autoPinEdge(toSuperviewEdge:.top) +// sendButton.autoPinEdge(toSuperviewEdge:.bottom) +// sendButton.autoPinEdge(.left, to:.right, of:buttonSpacer) +// } +// +// private func createButton(title: String, color: UIColor, action: Selector) -> UIView { +// let buttonWidth = ScaleFromIPhone5To7Plus(110, 140) +// let buttonHeight = ScaleFromIPhone5To7Plus(35, 45) +// +// return OWSFlatButton.button(title:title, +// titleColor:UIColor.white, +// backgroundColor:color, +// width:buttonWidth, +// height:buttonHeight, +// target:target, +// selector:action) +// } +// +// // MARK: - Event Handlers +// +// func donePressed(sender: UIButton) { +// dismiss(animated: true, completion:nil) +// } +// +// func cancelPressed(sender: UIButton) { +// dismiss(animated: true, completion:nil) +// } +// +// func sendPressed(sender: UIButton) { +// let successCompletion = self.successCompletion +// dismiss(animated: true, completion: { +// successCompletion?() +// }) +// } +// +// func audioPlayButtonPressed(sender: UIButton) { +// audioPlayer?.togglePlayState() +// } +// +// // MARK: - OWSAudioAttachmentPlayerDelegate +// +// public func isAudioPlaying() -> Bool { +// return isAudioPlayingFlag +// } +// +// public func setIsAudioPlaying(_ isAudioPlaying: Bool) { +// isAudioPlayingFlag = isAudioPlaying +// +// updateAudioStatusLabel() +// } +// +// public func isPaused() -> Bool { +// return isAudioPaused +// } +// +// public func setIsPaused(_ isPaused: Bool) { +// isAudioPaused = isPaused +// } +// +// public func setAudioProgress(_ progress: CGFloat, duration: CGFloat) { +// audioProgressSeconds = progress +// audioDurationSeconds = duration +// +// updateAudioStatusLabel() +// } +// +// private func updateAudioStatusLabel() { +// guard let audioStatusLabel = self.audioStatusLabel else { +// owsFail("Missing audio status label") +// return +// } +// +// if isAudioPlayingFlag && audioProgressSeconds > 0 && audioDurationSeconds > 0 { +// audioStatusLabel.text = String(format:"%@ / %@", +// ViewControllerUtils.formatDurationSeconds(Int(round(self.audioProgressSeconds))), +// ViewControllerUtils.formatDurationSeconds(Int(round(self.audioDurationSeconds)))) +// } else { +// audioStatusLabel.text = " " +// } +// } +// +// public func setAudioIconToPlay() { +// let image = UIImage(named:"audio_play_black_large")?.withRenderingMode(.alwaysTemplate) +// assert(image != nil) +// audioPlayButton?.setImage(image, for:.normal) +// audioPlayButton?.imageView?.tintColor = UIColor.ows_materialBlue() +// } +// +// public func setAudioIconToPause() { +// let image = UIImage(named:"audio_pause_black_large")?.withRenderingMode(.alwaysTemplate) +// assert(image != nil) +// audioPlayButton?.setImage(image, for:.normal) +// audioPlayButton?.imageView?.tintColor = UIColor.ows_materialBlue() +// } + + // MARK: - Event Handlers + + func donePressed(sender: UIButton) { + dismiss(animated: true, completion:nil) + } +}