Revision c6c7b30a
| 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 | 
    }  | 
|
| 526 | 534 | 
    }  | 
| 527 | 535 | 
    }  | 
| 528 | 536 | 
    }  | 
| ChatSecure/Classes/View Controllers/OTRMessagesViewController.m | ||
|---|---|---|
| 69 | 69 | 
    OTRDropDownTypePush = 2  | 
| 70 | 70 | 
    };  | 
| 71 | 71 | 
     | 
| 72 | 
    @interface OTRMessagesViewController () <UITextViewDelegate, OTRAttachmentPickerDelegate, OTRYapViewHandlerDelegateProtocol, OTRMessagesCollectionViewFlowLayoutSizeProtocol, OTRRoomOccupantsViewControllerDelegate> {
   | 
|
| 72 | 
    @interface OTRMessagesViewController () <UITextViewDelegate, OTRAttachmentPickerDelegate, OTRYapViewHandlerDelegateProtocol, OTRMessagesCollectionViewFlowLayoutSizeProtocol, OTRMessagesCollectionViewFlowLayoutSupplementaryViewProtocol, 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 | 
     | 
|
| 105 | 108 | 
    @end  | 
| 106 | 109 | 
     | 
| 107 | 110 | 
    @implementation OTRMessagesViewController  | 
| ... | ... | |
| 175 | 178 | 
    ///Custom Layout to account for no bubble cells  | 
| 176 | 179 | 
    OTRMessagesCollectionViewFlowLayout *layout = [[OTRMessagesCollectionViewFlowLayout alloc] init];  | 
| 177 | 180 | 
    layout.sizeDelegate = self;  | 
| 181 | 
    layout.supplementaryViewDelegate = self;  | 
|
| 178 | 182 | 
    self.collectionView.collectionViewLayout = layout;  | 
| 179 | 
     | 
|
| 183 | 
    UINib *nib = [UINib nibWithNibName:@"OTRMessageUnknownSenderCell" bundle:OTRAssets.resourcesBundle];  | 
|
| 184 | 
    [self.collectionView registerNib:nib forSupplementaryViewOfKind:[OTRMessagesUnknownSenderCell reuseIdentifier] withReuseIdentifier:[OTRMessagesUnknownSenderCell reuseIdentifier]];  | 
|
| 185 | 
     | 
|
| 180 | 186 | 
    ///"Loading Earlier" header view  | 
| 181 | 187 | 
    [self.collectionView registerNib:[UINib nibWithNibName:@"OTRMessagesLoadingView" bundle:OTRAssets.resourcesBundle]  | 
| 182 | 188 | 
    forSupplementaryViewOfKind:UICollectionElementKindSectionHeader  | 
| ... | ... | |
| 381 | 387 | 
    self.threadCollection = collection;  | 
| 382 | 388 | 
        [self.readOnlyDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction * _Nonnull transaction) {
   | 
| 383 | 389 | 
    self.senderId = [[self threadObjectWithTransaction:transaction] threadAccountIdentifier];  | 
| 390 | 
    self.automaticURLFetchingDisabled = [[self accountWithTransaction:transaction] disableAutomaticURLFetching];  | 
|
| 384 | 391 | 
    }];  | 
| 385 | 392 | 
     | 
| 386 | 393 | 
    // Clear out old state (don't just alloc a new object, we have KVOs attached to this!)  | 
| ... | ... | |
| 2287 | 2294 | 
    [self.navigationController.navigationController popViewControllerAnimated:YES];  | 
| 2288 | 2295 | 
    }  | 
| 2289 | 2296 | 
    }  | 
| 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 | 
     | 
|
| 2290 | 2338 | 
    @end  | 
| ChatSecure/Classes/Views/Cells/OTRMessageUnknownSenderCell.xib | ||
|---|---|---|
| 6 | 6 | 
    <dependencies>  | 
| 7 | 7 | 
    <deployment identifier="iOS"/>  | 
| 8 | 8 | 
    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13527"/>  | 
| 9 | 
    <capability name="Safe area layout guides" minToolsVersion="9.0"/>  | 
|
| 10 | 9 | 
    <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>  | 
| 11 | 10 | 
    </dependencies>  | 
| 12 | 11 | 
    <objects>  | 
| 13 | 12 | 
    <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>  | 
| 14 | 13 | 
    <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>  | 
| 15 | 
    <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="22J-kO-64R" customClass="OTRMessagesUnknownSenderCell" customModule="ChatSecureCore">  | 
|
| 14 | 
            <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="22J-kO-64R" customClass="OTRMessagesUnknownSenderCell" customModule="ChatSecureCore">
   | 
|
| 16 | 15 | 
    <rect key="frame" x="0.0" y="0.0" width="375" height="50"/>  | 
| 17 | 
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
   | 
|
| 16 | 
                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
   | 
|
| 18 | 17 | 
    <subviews>  | 
| 19 | 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">  | 
| 20 | 19 | 
    <rect key="frame" x="10" y="10" width="355" height="30"/>  | 
| 21 | 
                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
   | 
|
| 22 | 
                        <nil key="textColor"/>
   | 
|
| 20 | 
                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
   | 
|
| 21 | 
                        <color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
   | 
|
| 23 | 22 | 
    <nil key="highlightedColor"/>  | 
| 24 | 23 | 
    </label>  | 
| 25 | 24 | 
    </subviews>  | 
| 25 | 
    <color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>  | 
|
| 26 | 26 | 
    <constraints>  | 
| 27 | 
                    <constraint firstItem="2Di-RS-Jjo" firstAttribute="bottom" secondItem="tP4-Uw-Q8q" secondAttribute="bottom" constant="10" id="PTO-Cn-PH4"/>
   | 
|
| 28 | 
                    <constraint firstItem="2Di-RS-Jjo" firstAttribute="trailing" secondItem="tP4-Uw-Q8q" secondAttribute="trailing" constant="10" id="ZqZ-wZ-92N"/>
   | 
|
| 29 | 
                    <constraint firstItem="tP4-Uw-Q8q" firstAttribute="leading" secondItem="2Di-RS-Jjo" secondAttribute="leading" constant="10" id="lTY-I5-fsW"/>
   | 
|
| 30 | 
                    <constraint firstItem="tP4-Uw-Q8q" firstAttribute="top" secondItem="2Di-RS-Jjo" secondAttribute="top" constant="10" id="vjV-ke-Pc2"/>
   | 
|
| 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 | 31 | 
    </constraints>  | 
| 32 | 
    <viewLayoutGuide key="safeArea" id="2Di-RS-Jjo"/>  | 
|
| 33 | 32 | 
    <connections>  | 
| 34 | 33 | 
    <outlet property="titleLabel" destination="tP4-Uw-Q8q" id="b4e-Ao-C3K"/>  | 
| 35 | 34 | 
    </connections>  | 
| 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();  | 
|
| 21 | 23 | 
    /** "Add", Button title to add someone as a buddy */  | 
| 22 | 24 | 
    FOUNDATION_EXPORT NSString* ADD_STRING();  | 
| 23 | 25 | 
    /** "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."]; }
   | 
|
| 21 | 23 | 
    /** "Add", Button title to add someone as a buddy */  | 
| 22 | 24 | 
    NSString* ADD_STRING() { return [OTRLanguageManager translatedString:@"Add"]; }
   | 
| 23 | 25 | 
    /** "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."  | 
|
| 1185 | 1188 | 
    }  | 
| 1186 | 1189 | 
    }  | 
Also available in: Unified diff