From efe07e1ddb256eba8382fce9cf6814aa1f99cfa2 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 11 Oct 2018 19:40:47 -0600 Subject: [PATCH] Secret sender icon in message details --- .../Contents.json | 23 ++++ .../secret-sender-20@1x.png | Bin 0 -> 294 bytes .../secret-sender-20@2x.png | Bin 0 -> 454 bytes .../secret-sender-20@3x.png | Bin 0 -> 734 bytes .../MessageDetailViewController.swift | 103 ++++++++++-------- 5 files changed, 80 insertions(+), 46 deletions(-) create mode 100644 Signal/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json create mode 100644 Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png create mode 100644 Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png create mode 100644 Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png diff --git a/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json b/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json new file mode 100644 index 000000000..a88c98b9f --- /dev/null +++ b/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "secret-sender-20@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "secret-sender-20@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "secret-sender-20@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png b/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..683747983826e469ce870652b1f99d829eb2662b GIT binary patch literal 294 zcmV+>0oneEP)Px#;7LS5R5%gslQ9ayKomry*m?@jp#)nyk6>ZpDb~Vscm)f!UOTb3@(O~G#zu*6 zf-ACYHVHN&4m@`A|IcJ6BuVm18WJXhJi?|)U=uNVJ*3^lvCeFVAw?Nf4BLvnYoBDe zg08E4upYQ~q{uRxLo0ylb+lzjNzXc=l!5_Ysb2_OFR4x82DwfclclLsY7J>YaRM@v zl(P7)j5ZZA^xfxiXFn^OcSEsNW(^b literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png b/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2adc23b4fbede3b31dca0df09a1442bcadd4939a GIT binary patch literal 454 zcmV;%0XhDOP)Px$fJsC_R9Fe^S20e*KoATRQ5p)mG-;{Q)6pZ!{D7J##Nl8J4 zgcOOelQ7b7a_ozD4@7h;opx^TW^TNeEqgGiQ9E#$9k{g1TH07U2Kdk^5?*t>u;oz^ zd)v;1NFRr&6cnijz0Lg>9gKJ-@Tv1QO!=QSxj`Z7l>n0r8t$7vOlTG*rY0gZ-%R9! zLdZ=A=z1GgE-)jl=gx6ArxamUGHbb6xxkFHo-=n&0Tn&dzcF3a=P}ZW{OuvzU~sx zbrsOM2dk#ycN4wZS6BtSm}fWXyxQV9H)LdL{K`Y}VusE#OzD{*biBW??D>X%!}6=a9bVTHb2KvCZV@0 w+KgZ=4R|W{h($ literal 0 HcmV?d00001 diff --git a/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png b/Signal/Images.xcassets/ic_secret_sender_indicator.imageset/secret-sender-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..07d9bdfc9272eb8c303554f6d50948a25e666e38 GIT binary patch literal 734 zcmV<40wMj0P)Px%m`OxIRA>e5Sv^P`K^R>{tZhwaoi=G~Jd1#a7>Ni0D^U?Fth9F%2-s;QHl|1s z(rF^#4xVTJ2;30g(83ps!?jz9Su!G1U zm!dkr;5k3itAImGes(SNILYP65Ax z!o!M-8N1{S#XPW8mx3v<*=ON}srP{BXMM}bdjhwXRW zNyFy8FeYdkqD+EADa2kgOAuqA*Jyu_=u;AX6Dp*mVT$J(x&_BTKT*5GEfC< zew0=15Im-#a^kC)%r%)qZPZAu65@b3AP$HF;($0H4u}KdfH)uyhy&ulEzG?WB}kBl Q;Q#;t07*qoM6N<$f-lukT>t<8 literal 0 HcmV?d00001 diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 9254379b3..57a4739dd 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -161,6 +161,7 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele contentView.autoPinEdge(toSuperviewEdge: .top) contentView.autoPinEdge(toSuperviewEdge: .bottom) scrollView.layoutMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + scrollView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0) if hasMediaAttachment { let footer = UIToolbar() @@ -247,6 +248,7 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele continue } + // We use the "short" status message to avoid being redundant with the section title. let (recipientStatus, shortStatusMessage, _) = MessageRecipientStatusUtils.recipientStatusAndStatusMessage(outgoingMessage: outgoingMessage, recipientState: recipientState) guard recipientStatus == recipientStatusGroup else { @@ -266,10 +268,9 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele // Table view cells don't layout properly outside the // context of a table view. let cellView = ContactCellView() - // We use the "short" status message to avoid being redundant with the section title. if self.shouldShowUD, recipientState.wasSentByUD { - // TODO once design is complete, replace stand-in emoji - cellView.accessoryMessage = shortStatusMessage.rtlSafeAppend(" ").rtlSafeAppend("💌") + let udAccessoryView = self.buildUDAccessoryView(text: shortStatusMessage) + cellView.setAccessory(udAccessoryView) } else { cellView.accessoryMessage = shortStatusMessage } @@ -298,13 +299,24 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele } } - var sentText = DateUtil.formatPastTimestampRelativeToNow(message.timestamp) - if self.shouldShowUD, let incomingMessage = message as? TSIncomingMessage, incomingMessage.wasReceivedByUD { - sentText = sentText.rtlSafeAppend(" ").rtlSafeAppend("💌") + let sentText = DateUtil.formatPastTimestampRelativeToNow(message.timestamp) + let sentRow: UIStackView = valueRow(name: NSLocalizedString("MESSAGE_METADATA_VIEW_SENT_DATE_TIME", + comment: "Label for the 'sent date & time' field of the 'message metadata' view."), + value: sentText) + if let incomingMessage = message as? TSIncomingMessage { + if self.shouldShowUD, incomingMessage.wasReceivedByUD { + let icon = #imageLiteral(resourceName: "ic_secret_sender_indicator").withRenderingMode(.alwaysTemplate) + let iconView = UIImageView(image: icon) + iconView.tintColor = Theme.secondaryColor + iconView.setContentHuggingHigh() + sentRow.addArrangedSubview(iconView) + // keep the icon close to the label. + let spacerView = UIView() + spacerView.setContentHuggingLow() + sentRow.addArrangedSubview(spacerView) + } } - let sentRow = valueRow(name: NSLocalizedString("MESSAGE_METADATA_VIEW_SENT_DATE_TIME", - comment: "Label for the 'sent date & time' field of the 'message metadata' view."), - value: sentText) + sentRow.isUserInteractionEnabled = true sentRow.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(didLongPressSent))) rows.append(sentRow) @@ -319,24 +331,12 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele // TODO: We could include the "disappearing messages" state here. - var lastRow: UIView? - for row in rows { - contentView.addSubview(row) - row.autoPinLeadingToSuperviewMargin() - row.autoPinTrailingToSuperviewMargin() - - if let lastRow = lastRow { - row.autoPinEdge(.top, to: .bottom, of: lastRow, withOffset: 5) - } else { - row.autoPinEdge(toSuperviewEdge: .top, withInset: 20) - } - - lastRow = row - } - if let lastRow = lastRow { - lastRow.autoPinEdge(toSuperviewEdge: .bottom, withInset: 20) - } - + let rowStack = UIStackView(arrangedSubviews: rows) + rowStack.axis = .vertical + rowStack.spacing = 5 + contentView.addSubview(rowStack) + rowStack.autoPinEdgesToSuperviewMargins() + contentView.layoutIfNeeded() updateMessageBubbleViewLayout() } @@ -360,6 +360,10 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele var rows = [UIView]() if hasMediaAttachment { + // TODO this is only used for adding a not-yet-downloaded-attachment. Name more clearly? Or inline? + // if let undownloadedAttachmentRow = getUndownloadedAttachmentRow() { + // rows.append(undownloadedAttachmentRow) + // } rows += addAttachmentRows() } @@ -480,6 +484,24 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele return rows } + private func buildUDAccessoryView(text: String) -> UIView { + let label = UILabel() + label.textColor = Theme.secondaryColor + label.text = text + label.textAlignment = .right + label.font = UIFont.ows_mediumFont(withSize: 13) + + let image = #imageLiteral(resourceName: "ic_secret_sender_indicator").withRenderingMode(.alwaysTemplate) + let imageView = UIImageView(image: image) + imageView.tintColor = Theme.middleGrayColor + + let hStack = UIStackView(arrangedSubviews: [imageView, label]) + hStack.axis = .horizontal + hStack.spacing = 8 + + return hStack + } + private func nameLabel(text: String) -> UILabel { let label = UILabel() label.textColor = Theme.primaryColor @@ -498,33 +520,22 @@ class MessageDetailViewController: OWSViewController, MediaGalleryDataSourceDele return label } - private func valueRow(name: String, value: String, subtitle: String = "") -> UIView { - let row = UIView.container() + private func valueRow(name: String, value: String, subtitle: String = "") -> UIStackView { let nameLabel = self.nameLabel(text: name) let valueLabel = self.valueLabel(text: value) - row.addSubview(nameLabel) - row.addSubview(valueLabel) - nameLabel.autoPinLeadingToSuperviewMargin(withInset: 20) - valueLabel.autoPinTrailingToSuperviewMargin(withInset: 20) - valueLabel.autoPinLeading(toTrailingEdgeOf: nameLabel, offset: 10) - nameLabel.autoPinEdge(toSuperviewEdge: .top) - valueLabel.autoPinEdge(toSuperviewEdge: .top) + let hStackView = UIStackView(arrangedSubviews: [nameLabel, valueLabel]) + hStackView.axis = .horizontal + hStackView.spacing = 10 + hStackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) + hStackView.isLayoutMarginsRelativeArrangement = true if subtitle.count > 0 { let subtitleLabel = self.valueLabel(text: subtitle) subtitleLabel.textColor = Theme.secondaryColor - row.addSubview(subtitleLabel) - subtitleLabel.autoPinTrailingToSuperviewMargin() - subtitleLabel.autoPinLeading(toTrailingEdgeOf: nameLabel, offset: 10) - subtitleLabel.autoPinEdge(.top, to: .bottom, of: valueLabel, withOffset: 1) - subtitleLabel.autoPinEdge(toSuperviewEdge: .bottom) - } else if value.count > 0 { - valueLabel.autoPinEdge(toSuperviewEdge: .bottom) - } else { - nameLabel.autoPinEdge(toSuperviewEdge: .bottom) + hStackView.addArrangedSubview(subtitleLabel) } - return row + return hStackView } // MARK: - Actions