From f1dd615f1c7626eacd7f34b89c838f26201a3cd4 Mon Sep 17 00:00:00 2001 From: Dwayne Harris Date: Fri, 16 Nov 2018 00:52:26 -0800 Subject: [PATCH] Fix compose accessory view and add some visibility support --- .../Icons/Direct.imageset/Contents.json | 12 ++++ .../Icons/Direct.imageset/send.pdf | Bin 0 -> 3889 bytes .../Icons/Private.imageset/Contents.json | 12 ++++ .../Icons/Private.imageset/eye-off.pdf | Bin 0 -> 4133 bytes elpha-ios/Base.lproj/Main.storyboard | 24 +++---- elpha-ios/ComposeAccessoryView.swift | 19 ++++-- elpha-ios/ComposeAccessoryView.xib | 62 +++++++----------- elpha-ios/ComposeViewController.swift | 13 ++-- elpha-ios/FLAnimatedImageView+SetImage.swift | 10 +-- elpha-ios/StatusView.swift | 24 +++++-- elpha-ios/TimelineTableViewController.swift | 6 -- 11 files changed, 105 insertions(+), 77 deletions(-) create mode 100644 elpha-ios/Assets.xcassets/Icons/Direct.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Icons/Direct.imageset/send.pdf create mode 100644 elpha-ios/Assets.xcassets/Icons/Private.imageset/Contents.json create mode 100644 elpha-ios/Assets.xcassets/Icons/Private.imageset/eye-off.pdf diff --git a/elpha-ios/Assets.xcassets/Icons/Direct.imageset/Contents.json b/elpha-ios/Assets.xcassets/Icons/Direct.imageset/Contents.json new file mode 100644 index 0000000..7fa4dac --- /dev/null +++ b/elpha-ios/Assets.xcassets/Icons/Direct.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "send.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Icons/Direct.imageset/send.pdf b/elpha-ios/Assets.xcassets/Icons/Direct.imageset/send.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b46234689b39839c8ea601f97116cabf1fc725e0 GIT binary patch literal 3889 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 literal 0 HcmV?d00001 diff --git a/elpha-ios/Assets.xcassets/Icons/Private.imageset/Contents.json b/elpha-ios/Assets.xcassets/Icons/Private.imageset/Contents.json new file mode 100644 index 0000000..3d807e7 --- /dev/null +++ b/elpha-ios/Assets.xcassets/Icons/Private.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "eye-off.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/elpha-ios/Assets.xcassets/Icons/Private.imageset/eye-off.pdf b/elpha-ios/Assets.xcassets/Icons/Private.imageset/eye-off.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93396ccf1f9ba65429e56a6cc7270aeca67938b9 GIT binary patch literal 4133 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 - + - + @@ -1136,7 +1136,7 @@ - + @@ -1145,19 +1145,19 @@ - + @@ -1174,7 +1174,7 @@ - + @@ -1218,7 +1218,7 @@ - + diff --git a/elpha-ios/ComposeAccessoryView.swift b/elpha-ios/ComposeAccessoryView.swift index 1c18073..c6440ba 100644 --- a/elpha-ios/ComposeAccessoryView.swift +++ b/elpha-ios/ComposeAccessoryView.swift @@ -22,6 +22,12 @@ class ComposeAccessoryView: UIView { var delegate: ComposeAccessoryViewDelegate? = nil + var selectedVisibility: StatusVisibility = .public { + didSet { + visibilityButton.setTitle(" \(selectedVisibility.rawValue.capitalized)", for: .normal) + } + } + override init(frame: CGRect) { super.init(frame: frame) setup() @@ -36,19 +42,22 @@ class ComposeAccessoryView: UIView { Bundle.main.loadNibNamed("ComposeAccessoryView", owner: self, options: nil) addSubview(contentView) contentView.frame = self.bounds + contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + + attachmentButton.addTarget(self, action: #selector(attachmentTapped), for: .touchUpInside) + visibilityButton.addTarget(self, action: #selector(visibilityTapped), for: .touchUpInside) + tootButton.addTarget(self, action: #selector(tootTapped), for: .touchUpInside) } - @IBAction func attachmentTapped(_ sender: Any) { - print("Attachment tapped 1") + @objc func attachmentTapped() { delegate?.attachmentTapped() } - @IBAction func visibilityTapped(_ sender: Any) { - print("Visibility tapped 1") + @objc func visibilityTapped() { delegate?.visibilityTapped() } - @IBAction func tootTapped(_ sender: Any) { + @objc func tootTapped() { delegate?.tootTapped() } } diff --git a/elpha-ios/ComposeAccessoryView.xib b/elpha-ios/ComposeAccessoryView.xib index fc4da6a..2808bcf 100644 --- a/elpha-ios/ComposeAccessoryView.xib +++ b/elpha-ios/ComposeAccessoryView.xib @@ -13,10 +13,10 @@ - + - - + + @@ -24,54 +24,35 @@ - - - - + - - - - - - + + + + + + @@ -87,5 +68,8 @@ + + + diff --git a/elpha-ios/ComposeViewController.swift b/elpha-ios/ComposeViewController.swift index 98ebe52..6639840 100644 --- a/elpha-ios/ComposeViewController.swift +++ b/elpha-ios/ComposeViewController.swift @@ -21,6 +21,7 @@ class ComposeViewController: UIViewController { @IBOutlet var bottomConstraint: NSLayoutConstraint! let characterLimit = 500 + let composeAccessoryViewHeight: CGFloat = 55.0 var feedbackGenerator: UINotificationFeedbackGenerator? = nil var replyToStatus: StatusMO? = nil var composeAccessoryView: ComposeAccessoryView? = nil @@ -36,8 +37,9 @@ class ComposeViewController: UIViewController { statusTextView.layer.cornerRadius = 10 statusTextView.layer.masksToBounds = true - composeAccessoryView = ComposeAccessoryView() + composeAccessoryView = ComposeAccessoryView(frame: CGRect(x: 0.0, y: 0.0, width: self.view.bounds.size.width, height: composeAccessoryViewHeight)) composeAccessoryView!.delegate = self + composeAccessoryView!.selectedVisibility = .public statusTextView.delegate = self statusTextView.inputAccessoryView = composeAccessoryView @@ -82,17 +84,14 @@ class ComposeViewController: UIViewController { let endFrameY = endFrame?.origin.y ?? 0 if endFrameY >= UIScreen.main.bounds.size.height { - bottomConstraint.constant = 50.0 + bottomConstraint.constant = 0 } else { - bottomConstraint.constant = (endFrame?.size.height ?? 0.0) + 15 + bottomConstraint.constant = (endFrame?.size.height ?? 0.0) - 15 } } } @IBAction func dismissTapped(_ sender: Any) { - statusTextView.inputAccessoryView = nil - statusTextView.reloadInputViews() - dismiss(animated: true) } } @@ -106,7 +105,7 @@ extension ComposeViewController: UITextViewDelegate { extension ComposeViewController: ComposeAccessoryViewDelegate { func attachmentTapped() { - print("Attachment tapped") + AlertManager.shared.show(message: "Attachment support coming soon", category: .normal) } func visibilityTapped() { diff --git a/elpha-ios/FLAnimatedImageView+SetImage.swift b/elpha-ios/FLAnimatedImageView+SetImage.swift index 8c77f0d..8952b66 100644 --- a/elpha-ios/FLAnimatedImageView+SetImage.swift +++ b/elpha-ios/FLAnimatedImageView+SetImage.swift @@ -52,8 +52,8 @@ extension FLAnimatedImageView { func setImage(withURL url: URL, withShadow shadow: Bool = false, withContentMode contentMode: UIView.ContentMode = .scaleAspectFill) { func setShadow() { if shadow { - self.layer.shadowColor = UIColor.black.cgColor - self.layer.shadowOpacity = 0.8 + self.layer.shadowColor = UIColor(white: 0.0, alpha: 0.5).cgColor + self.layer.shadowOpacity = 1 self.layer.shadowOffset = CGSize.zero self.layer.shadowRadius = 10 } @@ -61,13 +61,14 @@ extension FLAnimatedImageView { if let data = ImageCache.get(url: url) { self.contentMode = contentMode - setShadow() if url.absoluteString.hasSuffix(".gif") { self.animatedImage = FLAnimatedImage(animatedGIFData: data) } else { self.image = UIImage(data: data) } + + setShadow() } else { setPlaceholder() @@ -77,13 +78,14 @@ extension FLAnimatedImageView { ImageCache.set(url: url, data: data) self.contentMode = contentMode - setShadow() if url.absoluteString.hasSuffix(".gif") { self.animatedImage = FLAnimatedImage(animatedGIFData: data) } else { self.image = UIImage(data: data) } + + setShadow() } } } diff --git a/elpha-ios/StatusView.swift b/elpha-ios/StatusView.swift index ccb40b8..43676d6 100644 --- a/elpha-ios/StatusView.swift +++ b/elpha-ios/StatusView.swift @@ -125,6 +125,13 @@ class StatusView: UIView { @IBAction func boostTapped(_ sender: Any) { if let status = status { + let allowedVisibility = [StatusVisibility.public, StatusVisibility.unlisted] + let visibility = StatusVisibility(rawValue: status.visibility!) + + guard allowedVisibility.contains(visibility!) else { + return + } + feedbackGenerator?.prepare() if status.reblogged { @@ -314,10 +321,19 @@ class StatusView: UIView { boostsLabel.text = NumberFormatter.localizedString(from: NSNumber(value: status.reblogsCount), number: .decimal) favoritesLabel.text = NumberFormatter.localizedString(from: NSNumber(value: status.favoritesCount), number: .decimal) - if status.reblogged { - boostsImageView.image = UIImage(named: "Boost Bold") - } else { - boostsImageView.image = UIImage(named: "Boost Regular") + let visibility = StatusVisibility(rawValue: status.visibility!) + + switch visibility! { + case .private: + boostsImageView.image = UIImage(named: "Private") + case .direct: + boostsImageView.image = UIImage(named: "Direct") + default: + if status.reblogged { + boostsImageView.image = UIImage(named: "Boost Bold") + } else { + boostsImageView.image = UIImage(named: "Boost Regular") + } } if status.favorited { diff --git a/elpha-ios/TimelineTableViewController.swift b/elpha-ios/TimelineTableViewController.swift index fe7fb50..1f5e127 100644 --- a/elpha-ios/TimelineTableViewController.swift +++ b/elpha-ios/TimelineTableViewController.swift @@ -77,12 +77,6 @@ class TimelineTableViewController: AbstractStatusTableViewController { if fetchedResultsController?.fetchedObjects?.count ?? 0 == 0 { initializeFetchedResultsController() } - - fetchTimeline { error in - if error != nil { - AlertManager.shared.show(message: error!.localizedDescription, category: .error) - } - } } override func loadMoreTapped(status: StatusMO, direction: PaginationDirection) {