Revision f3813541
ChatSecure.xcodeproj/project.pbxproj | ||
---|---|---|
109 | 109 |
63FCB1371DA3224A00A801F2 /* OTRSignalEncryptionHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63FCB1361DA3224A00A801F2 /* OTRSignalEncryptionHelper.swift */; }; |
110 | 110 |
7A6540ECCA04445E88F06962 /* Pods_ChatSecureCorePods_ChatSecureTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 281981F599E0F5C8397E6A3F /* Pods_ChatSecureCorePods_ChatSecureTests.framework */; }; |
111 | 111 |
8F56C3272EBE7F45BC8F925A /* OTRMessagesLoadingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8F56C50436DA64774EBB16E3 /* OTRMessagesLoadingView.xib */; }; |
112 |
9212364E1FCD779D009F97F0 /* OTRMessageUnknownSenderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9212364C1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.swift */; }; |
|
113 |
921236501FCD77B7009F97F0 /* OTRMessageUnknownSenderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9212364D1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.xib */; }; |
|
114 | 112 |
9236F56B1F21FFA600C963D0 /* OTRGroupAvatarGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9236F56A1F21FFA600C963D0 /* OTRGroupAvatarGenerator.swift */; }; |
115 | 113 |
924F67C51EA5541C00528FB6 /* MigrationInfoHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 924F67C41EA5541C00528FB6 /* MigrationInfoHeaderView.xib */; }; |
116 | 114 |
924F67C71EA55C6F00528FB6 /* MigrationInfoHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924F67C61EA55C6F00528FB6 /* MigrationInfoHeaderView.swift */; }; |
... | ... | |
1021 | 1019 |
7A62FCE8FEC1E7C9644F8C38 /* Pods-ChatSecureCorePods-ChatSecure.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatSecureCorePods-ChatSecure.release.xcconfig"; path = "Pods/Target Support Files/Pods-ChatSecureCorePods-ChatSecure/Pods-ChatSecureCorePods-ChatSecure.release.xcconfig"; sourceTree = "<group>"; }; |
1022 | 1020 |
8F56C50436DA64774EBB16E3 /* OTRMessagesLoadingView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = OTRMessagesLoadingView.xib; sourceTree = "<group>"; }; |
1023 | 1021 |
9118152C0A7B287ABD07FF70 /* Pods-ChatSecureCorePods-ChatSecureCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ChatSecureCorePods-ChatSecureCore.release.xcconfig"; path = "Pods/Target Support Files/Pods-ChatSecureCorePods-ChatSecureCore/Pods-ChatSecureCorePods-ChatSecureCore.release.xcconfig"; sourceTree = "<group>"; }; |
1024 |
9212364C1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTRMessageUnknownSenderCell.swift; sourceTree = "<group>"; }; |
|
1025 |
9212364D1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OTRMessageUnknownSenderCell.xib; sourceTree = "<group>"; }; |
|
1026 | 1022 |
9236F56A1F21FFA600C963D0 /* OTRGroupAvatarGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OTRGroupAvatarGenerator.swift; sourceTree = "<group>"; }; |
1027 | 1023 |
924F67C41EA5541C00528FB6 /* MigrationInfoHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MigrationInfoHeaderView.xib; path = Interface/MigrationInfoHeaderView.xib; sourceTree = "<group>"; }; |
1028 | 1024 |
924F67C61EA55C6F00528FB6 /* MigrationInfoHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationInfoHeaderView.swift; sourceTree = "<group>"; }; |
... | ... | |
1749 | 1745 |
D9C6E6A01B71575300572273 /* OTRUsernameCell.swift */, |
1750 | 1746 |
92CC68F01F42FF8D0006CDF8 /* OTRComposeGroupBuddyCell.swift */, |
1751 | 1747 |
92CC68F21F43054E0006CDF8 /* OTRComposeGroupBuddyCell.xib */, |
1752 |
9212364C1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.swift */, |
|
1753 |
9212364D1FCD779C009F97F0 /* OTRMessageUnknownSenderCell.xib */, |
|
1754 | 1748 |
); |
1755 | 1749 |
path = Cells; |
1756 | 1750 |
sourceTree = "<group>"; |
... | ... | |
2641 | 2635 |
D97070921EEF382D004FEBDE /* MediaDownloadView.xib in Resources */, |
2642 | 2636 |
924F68591EA7A31A00528FB6 /* MigratedBuddyHeaderView.xib in Resources */, |
2643 | 2637 |
8F56C3272EBE7F45BC8F925A /* OTRMessagesLoadingView.xib in Resources */, |
2644 |
921236501FCD77B7009F97F0 /* OTRMessageUnknownSenderCell.xib in Resources */, |
|
2645 | 2638 |
); |
2646 | 2639 |
runOnlyForDeploymentPostprocessing = 0; |
2647 | 2640 |
}; |
... | ... | |
3074 | 3067 |
D93DDA861BA79A2400CD8331 /* OTREncryptionManager.m in Sources */, |
3075 | 3068 |
D93DDA881BA79A2400CD8331 /* OTROAuthRefresher.m in Sources */, |
3076 | 3069 |
6340431B1BD5BCD800ECA95A /* OTRXMPPRoomMessage.swift in Sources */, |
3077 |
9212364E1FCD779D009F97F0 /* OTRMessageUnknownSenderCell.swift in Sources */, |
|
3078 | 3070 |
D93DDA891BA79A2400CD8331 /* OTRProtocolManager.m in Sources */, |
3079 | 3071 |
63DC417B1BB3767100D42857 /* Errors.swift in Sources */, |
3080 | 3072 |
D93DDA8A1BA79A2400CD8331 /* OTRSettingsManager.m in Sources */, |
ChatSecure/Classes/Controllers/FileTransferManager.swift | ||
---|---|---|
523 | 523 |
downloads = message.existingDownloads(with: transaction) |
524 | 524 |
if let thread = message.threadOwner(with: transaction), let account = OTRAccount.fetchObject(withUniqueID: thread.threadAccountIdentifier, transaction: transaction) { |
525 | 525 |
disableAutomaticURLFetching = account.disableAutomaticURLFetching |
526 |
if !disableAutomaticURLFetching, let room = thread as? OTRXMPPRoom, let message = message as? OTRXMPPRoomMessage { |
|
527 |
// For room messages, default to safe mode |
|
528 |
disableAutomaticURLFetching = true |
|
529 |
if let senderJidString = message.senderJID, let senderJID = XMPPJID(string: senderJidString), let roomJID = room.roomJID, let occupant = OTRXMPPRoomOccupant.occupant(jid: senderJID, realJID: senderJID, roomJID: roomJID, accountId: thread.threadAccountIdentifier, createIfNeeded: false, transaction: transaction), occupant.buddy(with: transaction) != nil { |
|
530 |
// We have a buddy, i.e. we are friends with the sender. |
|
531 |
disableAutomaticURLFetching = false |
|
532 |
} |
|
533 |
} |
|
534 | 526 |
} |
535 | 527 |
} |
536 | 528 |
} |
ChatSecure/Classes/View Controllers/OTRMessagesCollectionViewFlowLayout.swift | ||
---|---|---|
14 | 14 |
func hasBubbleSizeForCellAtIndexPath(_ indexPath: IndexPath) -> Bool |
15 | 15 |
} |
16 | 16 |
|
17 |
@objc public class OTRMessagesCollectionSupplementaryViewInfo: NSObject { |
|
18 |
public var kind:String |
|
19 |
public var height:CGFloat |
|
20 |
|
|
21 |
@objc public init(kind:String, height:CGFloat) { |
|
22 |
self.kind = kind |
|
23 |
self.height = height |
|
24 |
super.init() |
|
25 |
} |
|
26 |
} |
|
27 |
|
|
28 |
@objc public protocol OTRMessagesCollectionViewFlowLayoutSupplementaryViewProtocol { |
|
29 |
func supplementaryViewsForCellAtIndexPath(_ indexPath: IndexPath) -> [OTRMessagesCollectionSupplementaryViewInfo]? |
|
30 |
} |
|
31 |
|
|
32 | 17 |
@objc open class OTRMessagesCollectionViewFlowLayout:JSQMessagesCollectionViewFlowLayout { |
33 | 18 |
|
34 | 19 |
@objc open weak var sizeDelegate:OTRMessagesCollectionViewFlowLayoutSizeProtocol? |
35 |
@objc open weak var supplementaryViewDelegate:OTRMessagesCollectionViewFlowLayoutSupplementaryViewProtocol? |
|
36 |
|
|
20 |
|
|
37 | 21 |
@objc override open func messageBubbleSizeForItem(at indexPath: IndexPath!) -> CGSize { |
38 | 22 |
guard let delegate = self.sizeDelegate, !delegate.hasBubbleSizeForCellAtIndexPath(indexPath) else { |
39 | 23 |
return super.messageBubbleSizeForItem(at: indexPath) |
... | ... | |
43 | 27 |
return CGSize(width: 1, height: 0) |
44 | 28 |
} |
45 | 29 |
|
46 |
open override var collectionViewContentSize: CGSize { |
|
47 |
var size = super.collectionViewContentSize |
|
48 |
if let delegate = self.supplementaryViewDelegate { |
|
49 |
for section in 0..<self.collectionView.numberOfSections { |
|
50 |
for item in 0..<self.collectionView.numberOfItems(inSection: section) { |
|
51 |
if let views = delegate.supplementaryViewsForCellAtIndexPath(IndexPath(item: item, section: section)) { |
|
52 |
for view in views { |
|
53 |
size.height += view.height |
|
54 |
} |
|
55 |
} |
|
56 |
} |
|
57 |
} |
|
58 |
} |
|
59 |
return size |
|
60 |
} |
|
61 |
|
|
62 |
override open func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { |
|
63 |
guard var attributes = super.layoutAttributesForElements(in: rect) else { return nil } |
|
64 |
|
|
65 |
var offset:CGFloat = 0 |
|
66 |
for attribute in attributes { |
|
67 |
if (attribute.representedElementCategory == UICollectionElementCategory.cell) { |
|
68 |
attribute.frame = attribute.frame.offsetBy(dx: 0, dy: offset) |
|
69 |
if let delegate = self.supplementaryViewDelegate { |
|
70 |
if let views = delegate.supplementaryViewsForCellAtIndexPath(attribute.indexPath) { |
|
71 |
for view in views { |
|
72 |
offset += view.height |
|
73 |
let suppViewAttrs = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: view.kind, with: attribute.indexPath) |
|
74 |
suppViewAttrs.frame = CGRect(x: attribute.frame.origin.x, y: attribute.frame.origin.y+attribute.frame.size.height, width: attribute.frame.size.width, height: view.height) |
|
75 |
attributes.append(suppViewAttrs) |
|
76 |
} |
|
77 |
} |
|
78 |
} |
|
79 |
} |
|
80 |
} |
|
81 |
return attributes |
|
82 |
} |
|
83 | 30 |
} |
ChatSecure/Classes/View Controllers/OTRMessagesViewController.m | ||
---|---|---|
69 | 69 |
OTRDropDownTypePush = 2 |
70 | 70 |
}; |
71 | 71 |
|
72 |
@interface OTRMessagesViewController () <UITextViewDelegate, OTRAttachmentPickerDelegate, OTRYapViewHandlerDelegateProtocol, OTRMessagesCollectionViewFlowLayoutSizeProtocol, OTRMessagesCollectionViewFlowLayoutSupplementaryViewProtocol, OTRRoomOccupantsViewControllerDelegate> {
|
|
72 |
@interface OTRMessagesViewController () <UITextViewDelegate, OTRAttachmentPickerDelegate, OTRYapViewHandlerDelegateProtocol, OTRMessagesCollectionViewFlowLayoutSizeProtocol, OTRRoomOccupantsViewControllerDelegate> { |
|
73 | 73 |
JSQMessagesAvatarImage *_warningAvatarImage; |
74 | 74 |
JSQMessagesAvatarImage *_accountAvatarImage; |
75 | 75 |
JSQMessagesAvatarImage *_buddyAvatarImage; |
... | ... | |
102 | 102 |
@property (nonatomic, strong) id currentMessage; |
103 | 103 |
@property (nonatomic, strong) NSCache *messageSizeCache; |
104 | 104 |
|
105 |
@property (nonatomic) BOOL automaticURLFetchingDisabled; |
|
106 |
@property (nonatomic, strong) OTRMessagesUnknownSenderCell *prototypeCellUnknownSender; |
|
107 |
|
|
108 | 105 |
@end |
109 | 106 |
|
110 | 107 |
@implementation OTRMessagesViewController |
... | ... | |
178 | 175 |
///Custom Layout to account for no bubble cells |
179 | 176 |
OTRMessagesCollectionViewFlowLayout *layout = [[OTRMessagesCollectionViewFlowLayout alloc] init]; |
180 | 177 |
layout.sizeDelegate = self; |
181 |
layout.supplementaryViewDelegate = self; |
|
182 | 178 |
self.collectionView.collectionViewLayout = layout; |
183 |
UINib *nib = [UINib nibWithNibName:@"OTRMessageUnknownSenderCell" bundle:OTRAssets.resourcesBundle]; |
|
184 |
[self.collectionView registerNib:nib forSupplementaryViewOfKind:[OTRMessagesUnknownSenderCell reuseIdentifier] withReuseIdentifier:[OTRMessagesUnknownSenderCell reuseIdentifier]]; |
|
185 |
|
|
179 |
|
|
186 | 180 |
///"Loading Earlier" header view |
187 | 181 |
[self.collectionView registerNib:[UINib nibWithNibName:@"OTRMessagesLoadingView" bundle:OTRAssets.resourcesBundle] |
188 | 182 |
forSupplementaryViewOfKind:UICollectionElementKindSectionHeader |
... | ... | |
387 | 381 |
self.threadCollection = collection; |
388 | 382 |
[self.readOnlyDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) { |
389 | 383 |
self.senderId = [[self threadObjectWithTransaction:transaction] threadAccountIdentifier]; |
390 |
self.automaticURLFetchingDisabled = [[self accountWithTransaction:transaction] disableAutomaticURLFetching]; |
|
391 | 384 |
}]; |
392 | 385 |
|
393 | 386 |
// Clear out old state (don't just alloc a new object, we have KVOs attached to this!) |
... | ... | |
2294 | 2287 |
[self.navigationController.navigationController popViewControllerAnimated:YES]; |
2295 | 2288 |
} |
2296 | 2289 |
} |
2297 |
|
|
2298 |
#pragma - mark OTRMessagesCollectionViewFlowLayoutSupplementaryViewProtocol |
|
2299 |
|
|
2300 |
- (nullable NSArray *)supplementaryViewsForCellAtIndexPath:(NSIndexPath *)indexPath { |
|
2301 |
id<OTRMessageProtocol,JSQMessageData> message = [self messageAtIndexPath:indexPath]; |
|
2302 |
if ([self isGroupChat] && [message isKindOfClass:[OTRGroupDownloadMessage class]]) { |
|
2303 |
OTRGroupDownloadMessage *roomMessage = (OTRGroupDownloadMessage *)message; |
|
2304 |
// A message that is not automatically downloaded, even though auto download not disabled, means that this is group download message from someone who is not our friend. |
|
2305 |
if ([roomMessage.messageError isAutomaticDownloadError] && !self.automaticURLFetchingDisabled && [roomMessage.media isKindOfClass:[OTRImageItem class]]) { |
|
2306 |
if (!_prototypeCellUnknownSender) { |
|
2307 |
UINib *nib = [UINib nibWithNibName:@"OTRMessageUnknownSenderCell" bundle:OTRAssets.resourcesBundle]; |
|
2308 |
_prototypeCellUnknownSender = (OTRMessagesUnknownSenderCell *)[nib instantiateWithOwner:self options:nil][0]; |
|
2309 |
} |
|
2310 |
[self populateUnknownSenderCell:_prototypeCellUnknownSender withMessage:message]; |
|
2311 |
[_prototypeCellUnknownSender setNeedsLayout]; |
|
2312 |
[_prototypeCellUnknownSender layoutIfNeeded]; |
|
2313 |
_prototypeCellUnknownSender.frame = CGRectMake(0, 0, self.collectionView.bounds.size.width, _prototypeCellUnknownSender.frame.size.height); |
|
2314 |
int height = [_prototypeCellUnknownSender systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 1; |
|
2315 |
|
|
2316 |
OTRMessagesCollectionSupplementaryViewInfo *info = [[OTRMessagesCollectionSupplementaryViewInfo alloc] initWithKind:[OTRMessagesUnknownSenderCell reuseIdentifier] height:height]; |
|
2317 |
return [NSArray arrayWithObject:info]; |
|
2318 |
} |
|
2319 |
} |
|
2320 |
return nil; |
|
2321 |
} |
|
2322 |
|
|
2323 |
- (void)populateUnknownSenderCell:(OTRMessagesUnknownSenderCell *)cell withMessage:(id<OTRMessageProtocol,JSQMessageData>)message { |
|
2324 |
cell.titleLabel.text = [NSString stringWithFormat:ADD_FRIEND_TO_AUTO_DOWNLOAD(), message.senderDisplayName]; |
|
2325 |
} |
|
2326 |
|
|
2327 |
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { |
|
2328 |
if ([OTRMessagesUnknownSenderCell.reuseIdentifier isEqualToString:kind]) { |
|
2329 |
id<OTRMessageProtocol,JSQMessageData> message = [self messageAtIndexPath:indexPath]; |
|
2330 |
OTRMessagesUnknownSenderCell *cell = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:kind forIndexPath:indexPath]; |
|
2331 |
[self populateUnknownSenderCell:cell withMessage:message]; |
|
2332 |
return cell; |
|
2333 |
} |
|
2334 |
// We should never get there, but if we do, don't return nil |
|
2335 |
return [[UICollectionReusableView alloc] initWithFrame:CGRectZero]; |
|
2336 |
} |
|
2337 |
|
|
2338 | 2290 |
@end |
ChatSecure/Classes/Views/Cells/OTRMessageUnknownSenderCell.swift | ||
---|---|---|
1 |
// |
|
2 |
// OTRMessageUnknownSenderCell.swift |
|
3 |
// ChatSecureCore |
|
4 |
// |
|
5 |
// Created by N-Pex on 2017-11-27. |
|
6 |
// Copyright © 2017 Chris Ballinger. All rights reserved. |
|
7 |
// |
|
8 |
|
|
9 |
@objc public class OTRMessagesUnknownSenderCell: UICollectionReusableView { |
|
10 |
@objc public static let reuseIdentifier = "unknownSenderCell" |
|
11 |
|
|
12 |
@objc @IBOutlet open weak var titleLabel:UILabel! |
|
13 |
|
|
14 |
override open func layoutSubviews() { |
|
15 |
super.layoutSubviews() |
|
16 |
for view in subviews { |
|
17 |
if let label = view as? UILabel { |
|
18 |
if label.numberOfLines == 0 { |
|
19 |
label.preferredMaxLayoutWidth = label.bounds.width |
|
20 |
} |
|
21 |
} |
|
22 |
} |
|
23 |
|
|
24 |
} |
|
25 |
} |
ChatSecure/Classes/Views/Cells/OTRMessageUnknownSenderCell.xib | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8"?> |
|
2 |
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> |
|
3 |
<device id="retina4_7" orientation="portrait"> |
|
4 |
<adaptation id="fullscreen"/> |
|
5 |
</device> |
|
6 |
<dependencies> |
|
7 |
<deployment identifier="iOS"/> |
|
8 |
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13527"/> |
|
9 |
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
|
10 |
</dependencies> |
|
11 |
<objects> |
|
12 |
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> |
|
13 |
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> |
|
14 |
<collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="22J-kO-64R" customClass="OTRMessagesUnknownSenderCell" customModule="ChatSecureCore"> |
|
15 |
<rect key="frame" x="0.0" y="0.0" width="375" height="50"/> |
|
16 |
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> |
|
17 |
<subviews> |
|
18 |
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="1000" verticalHuggingPriority="1000" horizontalCompressionResistancePriority="1000" verticalCompressionResistancePriority="1000" text="No data" textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="tP4-Uw-Q8q"> |
|
19 |
<rect key="frame" x="10" y="10" width="355" height="30"/> |
|
20 |
<fontDescription key="fontDescription" type="system" pointSize="12"/> |
|
21 |
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> |
|
22 |
<nil key="highlightedColor"/> |
|
23 |
</label> |
|
24 |
</subviews> |
|
25 |
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/> |
|
26 |
<constraints> |
|
27 |
<constraint firstAttribute="bottom" secondItem="tP4-Uw-Q8q" secondAttribute="bottom" constant="10" id="PTO-Cn-PH4"/> |
|
28 |
<constraint firstAttribute="trailing" secondItem="tP4-Uw-Q8q" secondAttribute="trailing" constant="10" id="ZqZ-wZ-92N"/> |
|
29 |
<constraint firstItem="tP4-Uw-Q8q" firstAttribute="leading" secondItem="22J-kO-64R" secondAttribute="leading" constant="10" id="lTY-I5-fsW"/> |
|
30 |
<constraint firstItem="tP4-Uw-Q8q" firstAttribute="top" secondItem="22J-kO-64R" secondAttribute="top" constant="10" id="vjV-ke-Pc2"/> |
|
31 |
</constraints> |
|
32 |
<connections> |
|
33 |
<outlet property="titleLabel" destination="tP4-Uw-Q8q" id="b4e-Ao-C3K"/> |
|
34 |
</connections> |
|
35 |
</collectionReusableView> |
|
36 |
</objects> |
|
37 |
</document> |
OTRAssets/Strings/OTRStrings.h | ||
---|---|---|
18 | 18 |
FOUNDATION_EXPORT NSString* ADD_BUDDY_STRING(); |
19 | 19 |
/** "Add Existing Account", Label for button to create account by logging into an existing account */ |
20 | 20 |
FOUNDATION_EXPORT NSString* ADD_EXISTING_STRING(); |
21 |
/** "Is %@ your friend? Add him/her to auto-download pictures in the future.", Shown in chat view to prompt user to add friend for auto-download of group media messages. */ |
|
22 |
FOUNDATION_EXPORT NSString* ADD_FRIEND_TO_AUTO_DOWNLOAD(); |
|
23 | 21 |
/** "Add", Button title to add someone as a buddy */ |
24 | 22 |
FOUNDATION_EXPORT NSString* ADD_STRING(); |
25 | 23 |
/** "Advanced", String to describe advanced set of settings */ |
OTRAssets/Strings/OTRStrings.m | ||
---|---|---|
18 | 18 |
NSString* ADD_BUDDY_STRING() { return [OTRLanguageManager translatedString:@"Add Buddy"]; } |
19 | 19 |
/** "Add Existing Account", Label for button to create account by logging into an existing account */ |
20 | 20 |
NSString* ADD_EXISTING_STRING() { return [OTRLanguageManager translatedString:@"Add Existing Account"]; } |
21 |
/** "Is %@ your friend? Add him/her to auto-download pictures in the future.", Shown in chat view to prompt user to add friend for auto-download of group media messages. */ |
|
22 |
NSString* ADD_FRIEND_TO_AUTO_DOWNLOAD() { return [OTRLanguageManager translatedString:@"Is %@ your friend? Add him/her to auto-download pictures in the future."]; } |
|
23 | 21 |
/** "Add", Button title to add someone as a buddy */ |
24 | 22 |
NSString* ADD_STRING() { return [OTRLanguageManager translatedString:@"Add"]; } |
25 | 23 |
/** "Advanced", String to describe advanced set of settings */ |
OTRAssets/Strings/strings.json | ||
---|---|---|
1182 | 1182 |
}, "GROUP_INFO_YOU": { |
1183 | 1183 |
"comment": "This will be shown after your own JID in the group profile view", |
1184 | 1184 |
"string": "you" |
1185 |
}, "ADD_FRIEND_TO_AUTO_DOWNLOAD": { |
|
1186 |
"comment": "Shown in chat view to prompt user to add friend for auto-download of group media messages.", |
|
1187 |
"string": "Is %@ your friend? Add him/her to auto-download pictures in the future." |
|
1188 | 1185 |
} |
1189 | 1186 |
} |
Also available in: Unified diff