Contact Request: hide for SIP account

This patch checks when SIP account is used and disables functions
related to contact request:
 - allows sending contact request only to ContactMethod that conform
RING protocol and from RING account.
 - shows pending contact requests list only for RING accounts.

Change-Id: If1b3056207f21ca346ac18b656aa9ccba73eac0f
Reviewed-by: Anthony LĂ©onard <anthony.leonard@savoirfairelinux.com>
diff --git a/src/ContactRequestVC.mm b/src/ContactRequestVC.mm
index 082450a..037137a 100644
--- a/src/ContactRequestVC.mm
+++ b/src/ContactRequestVC.mm
@@ -45,27 +45,22 @@
     QObject::connect(&AvailableAccountModel::instance(),
                      &QAbstractItemModel::rowsRemoved,
                      [self]{
-                         [self.view setHidden:AvailableAccountModel::instance().rowCount() == 0];
+                         [self hideIfNeeded];
                      });
 
     QObject::connect(&AvailableAccountModel::instance(),
                      &QAbstractItemModel::dataChanged,
                      [self]{
-                         [self.view setHidden:AvailableAccountModel::instance().rowCount() == 0];
+                         [self hideIfNeeded];
+
                      });
     QObject::connect(AvailableAccountModel::instance().selectionModel(),
                      &QItemSelectionModel::currentChanged,
                      [self](const QModelIndex& idx){
-                         Account* chosenAccount = [self chosenAccount];
-                         if(chosenAccount) {
-                             [self connectAccountContactRequests];
-                         }
+                         [self setupWithSelectedAccount];
                      });
-    Account* chosenAccount = [self chosenAccount];
     self.hideRequestNumberLabel = YES;
-    if(chosenAccount) {
-        [self connectAccountContactRequests];
-    }
+    [self setupWithSelectedAccount];
 }
 
 - (IBAction)displayTrustRequests:(NSView*)sender
@@ -82,7 +77,7 @@
 }
 
 - (void)popoverDidClose:(NSNotification *)notification {
-    // when popover is closed remove ContactRequestsListVC to let it be allocated
+    // when popover is closed remove ContactRequestsListVC to let it be deallocated
     [pendingContactRequestPopover setContentViewController:nil];
 }
 
@@ -95,22 +90,33 @@
 -(Account* ) chosenAccount
 {
     QModelIndex index = AvailableAccountModel::instance().selectionModel()->currentIndex();
+    if(!index.isValid()) {
+        return nullptr;
+    }
     Account* account = index.data(static_cast<int>(Account::Role::Object)).value<Account*>();
     return account;
 }
 
--(void) connectAccountContactRequests
+-(void) setupWithSelectedAccount
 {
     Account* chosenAccount = [self chosenAccount];
+    if(!chosenAccount) {
+        return;
+    }
+    [self.view setHidden:chosenAccount->protocol() != Account::Protocol::RING];
+    if(chosenAccount->protocol() != Account::Protocol::RING) {
+        return;
+    }
+
     self.numberOfRequests = chosenAccount->pendingContactRequestModel()->rowCount();
 
     QObject::disconnect(requestAdded);
     requestAdded = QObject::connect(chosenAccount->pendingContactRequestModel(),
-                                   &QAbstractItemModel::rowsInserted,
-                                   [=]() {
-                                       self.numberOfRequests = chosenAccount->pendingContactRequestModel()->rowCount();
-                                   }
-                                   );
+                                    &QAbstractItemModel::rowsInserted,
+                                    [=]() {
+                                        self.numberOfRequests = chosenAccount->pendingContactRequestModel()->rowCount();
+                                    }
+                                    );
     QObject::disconnect(requestRemoved);
     requestRemoved = QObject::connect(chosenAccount->pendingContactRequestModel(),
                                       &QAbstractItemModel::rowsRemoved,
@@ -121,4 +127,17 @@
                                       );
 }
 
+-(void)hideIfNeeded
+{
+    if(AvailableAccountModel::instance().rowCount() == 0) {
+        [self.view setHidden:YES];
+        return;
+    }
+    Account* chosenAccount = [self chosenAccount];
+    if(!chosenAccount) {
+        return;
+    }
+    [self.view setHidden:chosenAccount->protocol() != Account::Protocol::RING];
+}
+
 @end
diff --git a/src/ConversationVC.mm b/src/ConversationVC.mm
index 5739e0f..cb3e6b1 100644
--- a/src/ConversationVC.mm
+++ b/src/ConversationVC.mm
@@ -63,6 +63,8 @@
     __unsafe_unretained IBOutlet NSTextField* emptyConversationPlaceHolder;
     __unsafe_unretained IBOutlet IconButton* sendButton;
     __unsafe_unretained IBOutlet NSPopUpButton* contactMethodsPopupButton;
+    __unsafe_unretained IBOutlet NSLayoutConstraint* sentContactRequestWidth;
+    __unsafe_unretained IBOutlet NSButton* sentContactRequestButton;
     IBOutlet MessagesVC* messagesViewVC;
 }
 
@@ -86,6 +88,16 @@
 
 }
 
+-(Account* ) chosenAccount
+{
+    QModelIndex index = AvailableAccountModel::instance().selectionModel()->currentIndex();
+    if(!index.isValid()) {
+        return nullptr;
+    }
+    Account* account = index.data(static_cast<int>(Account::Role::Object)).value<Account*>();
+    return account;
+}
+
 - (void) initFrame
 {
     [self.view setFrame:self.view.superview.bounds];
@@ -195,7 +207,6 @@
     [CATransaction commit];
 }
 
-
 #pragma mark - NSTextFieldDelegate
 
 - (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector
@@ -213,6 +224,25 @@
     NSInteger index = [(NSPopUpButton *)sender indexOfSelectedItem];
 
     selectedContactMethod = contactMethods.at(index);
+
+    /*to send contact request we need to meet two condition:
+     1)contact method has RING protocol
+     2)accound is used to send request is also RING*/
+
+    Boolean hideSendTrustRequestButton = NO;
+    if(selectedContactMethod->protocolHint() != URI::ProtocolHint::RING) {
+        hideSendTrustRequestButton = YES;
+    }
+    else if(selectedContactMethod->account()) {
+       hideSendTrustRequestButton = selectedContactMethod->account()->protocol() != Account::Protocol::RING;
+    }
+    else if([self chosenAccount]) {
+        Boolean hideSendTrustRequestButton = [self chosenAccount]->protocol() != Account::Protocol::RING;
+    }
+
+    [sentContactRequestButton setHidden:hideSendTrustRequestButton];
+    sentContactRequestWidth.priority = hideSendTrustRequestButton ? 999: 250;
+
     [conversationTitle setStringValue:selectedContactMethod->primaryName().toNSString()];
     QObject::disconnect(contactMethodChanged);
     contactMethodChanged = QObject::connect(selectedContactMethod,
diff --git a/ui/Base.lproj/Conversation.xib b/ui/Base.lproj/Conversation.xib
index 64b70fb..b01cada 100644
--- a/ui/Base.lproj/Conversation.xib
+++ b/ui/Base.lproj/Conversation.xib
@@ -15,6 +15,8 @@
                 <outlet property="messagesViewVC" destination="iH6-17-JsM" id="uxH-Ra-lSr"/>
                 <outlet property="sendButton" destination="UJf-cF-RAo" id="8PF-7G-w1d"/>
                 <outlet property="sendPanel" destination="Rth-di-Tls" id="vCd-kM-DLc"/>
+                <outlet property="sentContactRequestButton" destination="isI-We-3h9" id="Kal-Wn-gWo"/>
+                <outlet property="sentContactRequestWidth" destination="J5j-bs-Mgk" id="EQx-Gj-4vx"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
         </customObject>
@@ -291,6 +293,9 @@
                 </textField>
                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="isI-We-3h9">
                     <rect key="frame" x="711" y="537" width="73" height="32"/>
+                    <constraints>
+                        <constraint firstAttribute="width" priority="250" id="J5j-bs-Mgk"/>
+                    </constraints>
                     <buttonCell key="cell" type="push" title="Invite" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="9su-fU-MPG">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                         <font key="font" metaFont="system"/>