Replace MemberDetailsVC and ContactDetailsVC by using MatrixKit resources.

This commit is contained in:
giomfo 2015-06-16 13:54:12 +02:00
parent 2d083281ea
commit 7a50564740
15 changed files with 225 additions and 1191 deletions

View file

@ -11,11 +11,7 @@
32F90B7B1B28906400DDC61B /* empty.mm in Sources */ = {isa = PBXBuildFile; fileRef = 32F90B7A1B28906400DDC61B /* empty.mm */; };
71193D241A6D64F900E59A9E /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 71193D231A6D64F900E59A9E /* AddressBook.framework */; };
71193D291A6E3DC000E59A9E /* ContactsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71193D281A6E3DC000E59A9E /* ContactsViewController.m */; };
7176294C1A77F5D000927125 /* ContactDetailsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7176294B1A77F5D000927125 /* ContactDetailsViewController.m */; };
7176294F1A77FED800927125 /* ContactDetailsTableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7176294E1A77FED800927125 /* ContactDetailsTableCell.m */; };
717629521A7A682A00927125 /* countryCodes.plist in Resources */ = {isa = PBXBuildFile; fileRef = 717629511A7A682A00927125 /* countryCodes.plist */; };
71D2E4EC1A49814B000DE015 /* RoomMemberActionsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 71D2E4EB1A49814B000DE015 /* RoomMemberActionsCell.m */; };
71DB9DC11A495B6400504A09 /* MemberViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71DB9DC01A495B6400504A09 /* MemberViewController.m */; };
D648B86A591308736E2D4078 /* libPods-matrixConsole.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8141B1E2401FFCC3C5B99234 /* libPods-matrixConsole.a */; };
F013EEEC1A40D437002BB093 /* matrixConsole-Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = F013EEEB1A40D437002BB093 /* matrixConsole-Defaults.plist */; };
F01628C119E29C660071C473 /* default-profile.png in Resources */ = {isa = PBXBuildFile; fileRef = F01628BC19E29C660071C473 /* default-profile.png */; };
@ -66,15 +62,7 @@
71193D231A6D64F900E59A9E /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; };
71193D271A6E3DC000E59A9E /* ContactsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactsViewController.h; sourceTree = "<group>"; };
71193D281A6E3DC000E59A9E /* ContactsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactsViewController.m; sourceTree = "<group>"; };
7176294A1A77F5D000927125 /* ContactDetailsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsViewController.h; sourceTree = "<group>"; };
7176294B1A77F5D000927125 /* ContactDetailsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsViewController.m; sourceTree = "<group>"; };
7176294D1A77FED800927125 /* ContactDetailsTableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContactDetailsTableCell.h; sourceTree = "<group>"; };
7176294E1A77FED800927125 /* ContactDetailsTableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContactDetailsTableCell.m; sourceTree = "<group>"; };
717629511A7A682A00927125 /* countryCodes.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = countryCodes.plist; path = Resources/countryCodes.plist; sourceTree = "<group>"; };
71D2E4EA1A49814B000DE015 /* RoomMemberActionsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMemberActionsCell.h; sourceTree = "<group>"; };
71D2E4EB1A49814B000DE015 /* RoomMemberActionsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMemberActionsCell.m; sourceTree = "<group>"; };
71DB9DBF1A495B6400504A09 /* MemberViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemberViewController.h; sourceTree = "<group>"; };
71DB9DC01A495B6400504A09 /* MemberViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MemberViewController.m; sourceTree = "<group>"; };
8141B1E2401FFCC3C5B99234 /* libPods-matrixConsole.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-matrixConsole.a"; sourceTree = BUILT_PRODUCTS_DIR; };
B7EC7E45C718BF2BBCE0CF48 /* Pods-matrixConsole.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-matrixConsole.debug.xcconfig"; path = "Pods/Target Support Files/Pods-matrixConsole/Pods-matrixConsole.debug.xcconfig"; sourceTree = "<group>"; };
F013EEEB1A40D437002BB093 /* matrixConsole-Defaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "matrixConsole-Defaults.plist"; sourceTree = "<group>"; };
@ -209,16 +197,12 @@
children = (
F03EF5EC19F171EB00A0EE52 /* AuthenticationViewController.h */,
F03EF5ED19F171EB00A0EE52 /* AuthenticationViewController.m */,
7176294A1A77F5D000927125 /* ContactDetailsViewController.h */,
7176294B1A77F5D000927125 /* ContactDetailsViewController.m */,
71193D271A6E3DC000E59A9E /* ContactsViewController.h */,
71193D281A6E3DC000E59A9E /* ContactsViewController.m */,
F03EF5EA19F171EB00A0EE52 /* HomeViewController.h */,
F03EF5EB19F171EB00A0EE52 /* HomeViewController.m */,
F03EF5EE19F171EB00A0EE52 /* MasterTabBarController.h */,
F03EF5EF19F171EB00A0EE52 /* MasterTabBarController.m */,
71DB9DBF1A495B6400504A09 /* MemberViewController.h */,
71DB9DC01A495B6400504A09 /* MemberViewController.m */,
F03EF5F019F171EB00A0EE52 /* RecentsViewController.h */,
F03EF5F119F171EB00A0EE52 /* RecentsViewController.m */,
F0ADEFF91AD7D2B3008A4F21 /* RoomMembersViewController.h */,
@ -231,17 +215,6 @@
path = ViewController;
sourceTree = "<group>";
};
F03EF5FC19F1762000A0EE52 /* View */ = {
isa = PBXGroup;
children = (
7176294D1A77FED800927125 /* ContactDetailsTableCell.h */,
7176294E1A77FED800927125 /* ContactDetailsTableCell.m */,
71D2E4EA1A49814B000DE015 /* RoomMemberActionsCell.h */,
71D2E4EB1A49814B000DE015 /* RoomMemberActionsCell.m */,
);
path = View;
sourceTree = "<group>";
};
F0465AF71A251F85003639F9 /* Model */ = {
isa = PBXGroup;
children = (
@ -277,7 +250,6 @@
717629501A7A681B00927125 /* Resources */,
F021FBEC1A5EF57300EA3AE6 /* API */,
F0465AF71A251F85003639F9 /* Model */,
F03EF5FC19F1762000A0EE52 /* View */,
F03EF5E919F171EB00A0EE52 /* ViewController */,
F07A80D919DD9DE700B621A1 /* AppDelegate.h */,
F07A80DA19DD9DE700B621A1 /* AppDelegate.m */,
@ -467,7 +439,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7176294F1A77FED800927125 /* ContactDetailsTableCell.m in Sources */,
F07A80DB19DD9DE700B621A1 /* AppDelegate.m in Sources */,
F0ADEFFB1AD7D2B3008A4F21 /* RoomMembersViewController.m in Sources */,
F052377C1A7289F00079F3E0 /* APNSHandler.m in Sources */,
@ -478,13 +449,10 @@
F03EF5F819F171EB00A0EE52 /* MasterTabBarController.m in Sources */,
F0F535BB1ACD6C4F00B603F8 /* RageShakeManager.m in Sources */,
F03EF5F619F171EB00A0EE52 /* HomeViewController.m in Sources */,
71DB9DC11A495B6400504A09 /* MemberViewController.m in Sources */,
F03EF5F919F171EB00A0EE52 /* RecentsViewController.m in Sources */,
32F90B7B1B28906400DDC61B /* empty.mm in Sources */,
71193D291A6E3DC000E59A9E /* ContactsViewController.m in Sources */,
7176294C1A77F5D000927125 /* ContactDetailsViewController.m in Sources */,
F03EF5F719F171EB00A0EE52 /* AuthenticationViewController.m in Sources */,
71D2E4EC1A49814B000DE015 /* RoomMemberActionsCell.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View file

@ -19,7 +19,7 @@
#import "MasterTabBarController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate, MXKCallViewControllerDelegate> {
@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate, MXKCallViewControllerDelegate, MXKContactDetailsViewControllerDelegate, MXKRoomMemberDetailsViewControllerDelegate> {
BOOL isAPNSRegistered;
}

View file

@ -798,6 +798,20 @@
}
}
#pragma mark - MXKContactDetailsViewControllerDelegate
- (void)contactDetailsViewController:(MXKContactDetailsViewController *)contactDetailsViewController startChatWithMatrixId:(NSString *)matrixId
{
[self startPrivateOneToOneRoomWithUserId:matrixId];
}
#pragma mark - MXKRoomMemberDetailsViewControllerDelegate
- (void)roomMemberDetailsViewController:(MXKRoomMemberDetailsViewController *)roomMemberDetailsViewController startChatWithMemberId:(NSString *)matrixId
{
[self startPrivateOneToOneRoomWithUserId:matrixId];
}
#pragma mark - Call status handling
- (void)addCallStatusBar {

View file

@ -3,8 +3,6 @@
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
</dependencies>
<scenes>
<!--RecentsNav-->
@ -54,89 +52,7 @@
<!--Contact Details View Controller-->
<scene sceneID="aUh-hv-QyM">
<objects>
<tableViewController storyboardIdentifier="ContailDetails" id="ro1-6w-v07" customClass="ContactDetailsViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="KA5-Lt-UeW">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<view key="tableHeaderView" contentMode="scaleToFill" id="wHE-vJ-da4" userLabel="TableHeaderView">
<rect key="frame" x="0.0" y="64" width="600" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TIr-2a-W5c" userLabel="PicturePickerButton">
<rect key="frame" x="10" y="12" width="75" height="75"/>
<constraints>
<constraint firstAttribute="height" constant="75" id="9l9-Va-Agc"/>
<constraint firstAttribute="width" secondItem="TIr-2a-W5c" secondAttribute="height" multiplier="1:1" id="JeU-uN-1b1"/>
<constraint firstAttribute="width" constant="75" id="dCr-jN-mEm"/>
</constraints>
<state key="normal" image="default-profile.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" editable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xfL-PN-omV">
<rect key="frame" x="95" y="-50" width="495" height="199"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="centerY" secondItem="xfL-PN-omV" secondAttribute="centerY" id="5Ms-9y-TtU"/>
<constraint firstItem="xfL-PN-omV" firstAttribute="leading" secondItem="wHE-vJ-da4" secondAttribute="leading" constant="95" id="IRs-nX-c1a"/>
<constraint firstAttribute="trailing" secondItem="xfL-PN-omV" secondAttribute="trailing" constant="10" id="QFM-cS-OBQ"/>
<constraint firstAttribute="centerY" secondItem="TIr-2a-W5c" secondAttribute="centerY" id="RhC-Y8-xMS"/>
<constraint firstItem="TIr-2a-W5c" firstAttribute="leading" secondItem="wHE-vJ-da4" secondAttribute="leading" constant="10" id="ZDO-K6-9fo"/>
</constraints>
</view>
<prototypes>
<tableViewCell contentMode="scaleToFill" restorationIdentifier="ContactDetailsTableCell" selectionStyle="default" indentationWidth="10" reuseIdentifier="ContactDetailsTableCell" id="ey2-8d-bAQ" customClass="ContactDetailsTableCell">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ey2-8d-bAQ" id="ILF-Ln-sNi">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="S9h-1k-m1C">
<rect key="frame" x="8" y="12" width="500" height="19"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kCn-d9-lc4">
<rect key="frame" x="518" y="6" width="70" height="30"/>
<constraints>
<constraint firstAttribute="width" constant="70" id="eXR-zg-Qm3"/>
<constraint firstAttribute="height" constant="30" id="tr0-3G-yTa"/>
</constraints>
<state key="normal" title="Start Chat"/>
</button>
</subviews>
<constraints>
<constraint firstItem="S9h-1k-m1C" firstAttribute="leading" secondItem="ILF-Ln-sNi" secondAttribute="leadingMargin" id="5zV-bs-dj1"/>
<constraint firstAttribute="trailingMargin" secondItem="kCn-d9-lc4" secondAttribute="trailing" constant="4" id="L4a-FW-jbQ"/>
<constraint firstItem="S9h-1k-m1C" firstAttribute="top" secondItem="ILF-Ln-sNi" secondAttribute="topMargin" constant="4" id="MPG-Ag-s9W"/>
<constraint firstAttribute="centerY" secondItem="kCn-d9-lc4" secondAttribute="centerY" constant="0.5" id="Oja-y0-bFI"/>
<constraint firstItem="kCn-d9-lc4" firstAttribute="leading" secondItem="S9h-1k-m1C" secondAttribute="trailing" constant="10" id="Sjr-GD-lXR"/>
<constraint firstAttribute="bottomMargin" secondItem="S9h-1k-m1C" secondAttribute="bottom" constant="4" id="iid-05-Gtz"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="matrixUserIDLabel" destination="S9h-1k-m1C" id="qBo-4s-peS"/>
<outlet property="startChatButton" destination="kCn-d9-lc4" id="huZ-QP-uor"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="ro1-6w-v07" id="QYY-hP-cyg"/>
<outlet property="delegate" destination="ro1-6w-v07" id="WxI-AT-vO9"/>
</connections>
</tableView>
<connections>
<outlet property="memberThumbnailButton" destination="TIr-2a-W5c" id="85L-YN-L8P"/>
<outlet property="roomMemberMID" destination="xfL-PN-omV" id="L07-JN-H3p"/>
</connections>
</tableViewController>
<tableViewController id="ro1-6w-v07" customClass="MXKContactDetailsViewController" sceneMemberID="viewController"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="cKT-B6-clR" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1517" y="801"/>
@ -162,93 +78,10 @@
</objects>
<point key="canvasLocation" x="2895" y="-290"/>
</scene>
<!--DetailMember-->
<!--Room Member Details View Controller-->
<scene sceneID="q1J-Wz-aLa">
<objects>
<tableViewController id="qlN-Mb-ZH7" userLabel="DetailMember" customClass="MemberViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="euy-fV-mSK">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<view key="tableHeaderView" contentMode="scaleToFill" id="Dog-RG-0F9" userLabel="TableHeaderView">
<rect key="frame" x="0.0" y="64" width="600" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleAspectFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PLk-7G-Li9" userLabel="PicturePickerButton">
<rect key="frame" x="10" y="12" width="75" height="75"/>
<constraints>
<constraint firstAttribute="width" secondItem="PLk-7G-Li9" secondAttribute="height" multiplier="1:1" id="BDm-oa-tFY"/>
<constraint firstAttribute="width" constant="75" id="PEb-3J-Qb3"/>
<constraint firstAttribute="height" constant="75" id="u7H-gw-Ry4"/>
</constraints>
<state key="normal" image="default-profile.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" editable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e5s-dh-H4J">
<rect key="frame" x="95" y="-26" width="495" height="151"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="e5s-dh-H4J" firstAttribute="leading" secondItem="Dog-RG-0F9" secondAttribute="leading" constant="95" id="0qf-mY-DBa"/>
<constraint firstAttribute="centerY" secondItem="e5s-dh-H4J" secondAttribute="centerY" id="Bb2-vL-ktJ"/>
<constraint firstAttribute="trailing" secondItem="e5s-dh-H4J" secondAttribute="trailing" constant="10" id="aQ9-eM-Pzu"/>
<constraint firstAttribute="centerY" secondItem="PLk-7G-Li9" secondAttribute="centerY" id="kjF-HV-ZXu"/>
<constraint firstItem="PLk-7G-Li9" firstAttribute="leading" secondItem="Dog-RG-0F9" secondAttribute="leading" constant="10" id="vp2-QW-00a"/>
</constraints>
</view>
<prototypes>
<tableViewCell contentMode="scaleToFill" restorationIdentifier="MemberActionsCell" selectionStyle="default" indentationWidth="10" reuseIdentifier="MemberActionsCell" id="zRe-DS-U67" customClass="RoomMemberActionsCell">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="zRe-DS-U67" id="C5i-Xc-2Zi">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="1wm-Iq-0AV">
<rect key="frame" x="15" y="7" width="270" height="30"/>
<state key="normal" title="leftButton"/>
<connections>
<action selector="onButtonToggle:" destination="qlN-Mb-ZH7" eventType="touchUpInside" id="Wyh-9j-XfT"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fW1-mK-8cr" userLabel="rightButton">
<rect key="frame" x="315" y="7" width="270" height="30"/>
<state key="normal" title="rightButton"/>
<connections>
<action selector="onButtonToggle:" destination="qlN-Mb-ZH7" eventType="touchUpInside" id="qJQ-h5-V6K"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="fW1-mK-8cr" firstAttribute="leading" secondItem="1wm-Iq-0AV" secondAttribute="trailing" constant="30" id="dLu-Mm-iRr"/>
<constraint firstAttribute="centerY" secondItem="fW1-mK-8cr" secondAttribute="centerY" id="fTA-lc-Gew"/>
<constraint firstItem="1wm-Iq-0AV" firstAttribute="leading" secondItem="C5i-Xc-2Zi" secondAttribute="leading" constant="15" id="jXu-vD-gsh"/>
<constraint firstItem="1wm-Iq-0AV" firstAttribute="width" secondItem="fW1-mK-8cr" secondAttribute="width" id="qKJ-6H-KOM"/>
<constraint firstAttribute="trailing" secondItem="fW1-mK-8cr" secondAttribute="trailing" constant="15" id="rhr-8v-COx"/>
<constraint firstAttribute="centerY" secondItem="1wm-Iq-0AV" secondAttribute="centerY" id="vru-fx-lq1"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="leftButton" destination="1wm-Iq-0AV" id="aDO-vS-rnE"/>
<outlet property="rightButton" destination="fW1-mK-8cr" id="2xz-UI-18C"/>
</connections>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="qlN-Mb-ZH7" id="ipl-VO-ZdA"/>
<outlet property="delegate" destination="qlN-Mb-ZH7" id="ceB-pW-r7c"/>
</connections>
</tableView>
<connections>
<outlet property="memberThumbnailButton" destination="PLk-7G-Li9" id="Rol-K2-IAS"/>
<outlet property="roomMemberMID" destination="e5s-dh-H4J" id="Upn-om-4du"/>
<outlet property="tableView" destination="euy-fV-mSK" id="MQl-lX-QSp"/>
</connections>
</tableViewController>
<tableViewController id="qlN-Mb-ZH7" customClass="MXKRoomMemberDetailsViewController" sceneMemberID="viewController"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="mrY-z4-HGF" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2895" y="488"/>
@ -489,14 +322,13 @@
</scene>
</scenes>
<resources>
<image name="default-profile.png" width="160" height="160"/>
<image name="icon_users.png" width="35" height="25"/>
<image name="tab_home.ico" width="16" height="16"/>
<image name="tab_settings.png" width="25" height="25"/>
</resources>
<inferredMetricsTieBreakers>
<segue reference="17E-G9-IZ6"/>
<segue reference="m9P-N3-WZN"/>
<segue reference="Vo4-8x-dtH"/>
<segue reference="9Sj-Yf-p2I"/>
<segue reference="17E-G9-IZ6"/>
</inferredMetricsTieBreakers>
</document>

View file

@ -1,25 +0,0 @@
/*
Copyright 2014 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <UIKit/UIKit.h>
@interface ContactDetailsTableCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *matrixUserIDLabel;
@property (strong, nonatomic) IBOutlet UIButton *startChatButton;
@end

View file

@ -1,20 +0,0 @@
/*
Copyright 2014 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "ContactDetailsTableCell.h"
@implementation ContactDetailsTableCell
@end

View file

@ -1,27 +0,0 @@
/*
Copyright 2014 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <UIKit/UIKit.h>
@interface RoomMemberActionsCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIButton *rightButton;
@property (weak, nonatomic) IBOutlet UIButton *leftButton;
-(void) setLeftButtonText:(NSString*)text;
-(void) setRightButtonText:(NSString*)text;
@end

View file

@ -1,41 +0,0 @@
/*
Copyright 2014 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "RoomMemberActionsCell.h"
@implementation RoomMemberActionsCell
- (void)initButton:(UIButton*)button withText:(NSString*)text {
button.hidden = (text.length == 0);
button.layer.borderColor = button.tintColor.CGColor;
button.layer.borderWidth = 1;
button.layer.cornerRadius = 5;
[button setTitle:text forState:UIControlStateNormal];
[button setTitle:text forState:UIControlStateHighlighted];
}
- (void) setLeftButtonText:(NSString*)text {
[self initButton:self.leftButton withText:text];
}
- (void) setRightButtonText:(NSString*)text {
[self initButton:self.rightButton withText:text];
}
@end

View file

@ -1,25 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <MatrixKit/MatrixKit.h>
#import "MXKContact.h"
@interface ContactDetailsViewController : MXKTableViewController
@property (strong, nonatomic) MXKContact* contact;
@end

View file

@ -1,131 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "ContactDetailsViewController.h"
#import "ContactDetailsTableCell.h"
#import "AppDelegate.h"
#import "RageShakeManager.h"
@interface ContactDetailsViewController () {
NSArray* matrixIDs;
}
@property (weak, nonatomic) IBOutlet UIButton *memberThumbnailButton;
@property (weak, nonatomic) IBOutlet UITextView *roomMemberMID;
@end
@implementation ContactDetailsViewController
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
self.memberThumbnailButton = nil;
self.roomMemberMID = nil;
matrixIDs = nil;
}
- (void)viewDidLoad {
[super viewDidLoad];
// remove the line separator color
self.tableView.separatorColor = [UIColor clearColor];
self.tableView.rowHeight = 44;
self.tableView.allowsSelection = NO;
// Set rageShake handler
self.rageShakeManager = [RageShakeManager sharedManager];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.roomMemberMID.text = _contact.displayName;
// set the thumbnail info
[self.memberThumbnailButton.imageView setContentMode: UIViewContentModeScaleAspectFill];
[self.memberThumbnailButton.imageView setClipsToBounds:YES];
if (_contact.thumbnail) {
self.memberThumbnailButton.imageView.image = _contact.thumbnail;
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onThumbnailUpdate:) name:kMXKContactThumbnailUpdateNotification object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
matrixIDs = _contact.matrixIdentifiers;
return matrixIDs.count;
}
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger row = indexPath.row;
ContactDetailsTableCell* contactDetailsTableCell = (ContactDetailsTableCell*)[aTableView dequeueReusableCellWithIdentifier:@"ContactDetailsTableCell" forIndexPath:indexPath];
if (row < matrixIDs.count) {
contactDetailsTableCell.matrixUserIDLabel.text = [matrixIDs objectAtIndex:row];
} else {
// should never happen
contactDetailsTableCell.matrixUserIDLabel.text = @"";
}
[contactDetailsTableCell.startChatButton addTarget:self action:@selector(startChat:) forControlEvents:UIControlEventTouchUpInside];
return contactDetailsTableCell;
}
- (void)startChat:(UIButton*)sender {
UIView* view = sender;
// search the parentce cell
while (view && ![view isKindOfClass:[ContactDetailsTableCell class]]) {
view = view.superview;
}
if ([view isKindOfClass:[ContactDetailsTableCell class]]) {
dispatch_async(dispatch_get_main_queue(), ^{
[[AppDelegate theDelegate] startPrivateOneToOneRoomWithUserId:((ContactDetailsTableCell*)view).matrixUserIDLabel.text];
});
}
}
- (void)onThumbnailUpdate:(NSNotification *)notif {
// sanity check
if ([notif.object isKindOfClass:[NSString class]]) {
NSString* matrixID = notif.object;
if ([matrixID isEqualToString:self.contact.contactID]) {
if (_contact.thumbnail) {
self.memberThumbnailButton.imageView.image = _contact.thumbnail;
}
}
}
}
@end

View file

@ -20,14 +20,19 @@
#import "RageShakeManager.h"
#import "ContactDetailsViewController.h"
NSString *const kInvitationMessage = @"I'd like to chat with you with matrix. Please, visit the website http://matrix.org to have more information.";
@interface ContactsViewController ()
{
// tap on thumbnail to display matrix information.
/**
Tap on thumbnail --> display matrix information.
*/
MXKContact* selectedContact;
/**
Keep reference on the current pushed view controller to release it correctly
*/
id destinationViewController;
}
@property (strong, nonatomic) MXKAlert *startChatMenu;
@ -50,6 +55,20 @@ NSString *const kInvitationMessage = @"I'd like to chat with you with matrix. Pl
self.delegate = self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (destinationViewController)
{
if ([destinationViewController respondsToSelector:@selector(destroy)])
{
[destinationViewController destroy];
}
destinationViewController = nil;
}
}
- (void)destroy
{
if (self.startChatMenu)
@ -83,7 +102,7 @@ NSString *const kInvitationMessage = @"I'd like to chat with you with matrix. Pl
{
__weak typeof(self) weakSelf = self;
self.allowContactSyncAlert = [[MXKAlert alloc] initWithTitle:@"Allow local contacts synchronization ?" message:nil style:MXKAlertStyleAlert];
self.allowContactSyncAlert = [[MXKAlert alloc] initWithTitle:@"Allow local contacts synchronization?" message:nil style:MXKAlertStyleAlert];
[self.allowContactSyncAlert addActionWithTitle:@"No" style:MXKAlertActionStyleDefault handler:^(MXKAlert *alert)
{
@ -259,9 +278,17 @@ NSString *const kInvitationMessage = @"I'd like to chat with you with matrix. Pl
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Keep ref on destinationViewController
destinationViewController = segue.destinationViewController;
if ([segue.identifier isEqualToString:@"showContactDetails"])
{
ContactDetailsViewController *contactDetailsViewController = segue.destinationViewController;
MXKContactDetailsViewController *contactDetailsViewController = destinationViewController;
// Set rageShake handler
contactDetailsViewController.rageShakeManager = [RageShakeManager sharedManager];
// Set delegate to handle start chat option
contactDetailsViewController.delegate = [AppDelegate theDelegate];
contactDetailsViewController.contact = selectedContact;
selectedContact = nil;
}

View file

@ -1,30 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import <MatrixKit/MatrixKit.h>
@interface MemberViewController : MXKTableViewController
@property (strong, nonatomic) MXRoomMember *mxRoomMember;
@property (strong, nonatomic) MXRoom *mxRoom;
/**
Dispose of any resources.
*/
- (void)destroy;
@end

View file

@ -1,575 +0,0 @@
/*
Copyright 2015 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#import "MemberViewController.h"
#import "AppDelegate.h"
#import "RoomMemberActionsCell.h"
#import "RageShakeManager.h"
@interface MemberViewController () {
NSString *thumbnailURL;
MXKMediaLoader* imageLoader;
id membersListener;
NSMutableArray* buttonsTitles;
// mask view while processing a request
UIView* pendingRequestMask;
UIActivityIndicatorView * pendingMaskSpinnerView;
// Observe left rooms
id kMXSessionWillLeaveRoomNotificationObserver;
}
// graphical objects
@property (weak, nonatomic) IBOutlet UIButton *memberThumbnailButton;
@property (weak, nonatomic) IBOutlet UITextView *roomMemberMID;
@property (strong, nonatomic) MXKAlert *actionMenu;
- (IBAction)onButtonToggle:(id)sender;
@end
@implementation MemberViewController
@synthesize mxRoom;
- (void)dealloc {
}
- (void)viewDidLoad {
[super viewDidLoad];
// remove the line separator color
self.tableView.separatorColor = [UIColor clearColor];
self.tableView.rowHeight = 44;
self.tableView.allowsSelection = NO;
buttonsTitles = [[NSMutableArray alloc] init];
// Set rageShake handler
self.rageShakeManager = [RageShakeManager sharedManager];
// ignore useless update
if (_mxRoomMember) {
[self updateMemberInfo];
}
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (mxRoom) {
// Observe room's members update
NSArray *mxMembersEvents = @[
kMXEventTypeStringRoomMember,
kMXEventTypeStringRoomPowerLevels
];
membersListener = [mxRoom listenToEventsOfTypes:mxMembersEvents onEvent:^(MXEvent *event, MXEventDirection direction, id customObject) {
// consider only live event
if (direction == MXEventDirectionForwards) {
// Hide potential action sheet
if (self.actionMenu) {
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
MXRoomMember* nextRoomMember = nil;
// get the updated memmber
NSArray* membersList = [self.mxRoom.state members];
for (MXRoomMember* member in membersList) {
if ([member.userId isEqualToString:_mxRoomMember.userId]) {
nextRoomMember = member;
break;
}
}
// does the member still exist ?
if (nextRoomMember) {
// Refresh members list
_mxRoomMember = nextRoomMember;
[self updateMemberInfo];
[self.tableView reloadData];
} else {
[self withdrawViewControllerAnimated:YES completion:nil];
}
}
}];
}
// Observe kMXSessionWillLeaveRoomNotification to be notified if the user leaves the current room.
kMXSessionWillLeaveRoomNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXSessionWillLeaveRoomNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
// Check whether the user will leave the room related to the displayed member
if (notif.object == self.mainSession) {
NSString *roomId = notif.userInfo[kMXSessionNotificationRoomIdKey];
if (roomId && [roomId isEqualToString:mxRoom.state.roomId]) {
// We must remove the current view controller.
[self withdrawViewControllerAnimated:YES completion:nil];
}
}
}];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Remove observers
if (kMXSessionWillLeaveRoomNotificationObserver) {
[[NSNotificationCenter defaultCenter] removeObserver:kMXSessionWillLeaveRoomNotificationObserver];
kMXSessionWillLeaveRoomNotificationObserver = nil;
}
[[NSNotificationCenter defaultCenter] removeObserver:self];
if (imageLoader) {
[imageLoader cancel];
imageLoader = nil;
}
if (membersListener && mxRoom) {
[mxRoom removeListener:membersListener];
membersListener = nil;
}
}
- (void)destroy {
// close any pending actionsheet
if (self.actionMenu) {
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
if (membersListener && mxRoom) {
[mxRoom removeListener:membersListener];
membersListener = nil;
}
// Remove observers
if (kMXSessionWillLeaveRoomNotificationObserver) {
[[NSNotificationCenter defaultCenter] removeObserver:kMXSessionWillLeaveRoomNotificationObserver];
}
[[NSNotificationCenter defaultCenter] removeObserver:self];
if (imageLoader) {
[imageLoader cancel];
imageLoader = nil;
}
}
- (void)updateMemberInfo {
self.title = _mxRoomMember.displayname ? _mxRoomMember.displayname : _mxRoomMember.userId;
// set the thumbnail info
[[self.memberThumbnailButton imageView] setContentMode: UIViewContentModeScaleAspectFill];
[[self.memberThumbnailButton imageView] setClipsToBounds:YES];
// Remove any pending observers
[[NSNotificationCenter defaultCenter] removeObserver:self];
if (_mxRoomMember.avatarUrl) {
// Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server
thumbnailURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:_mxRoomMember.avatarUrl toFitViewSize:self.memberThumbnailButton.frame.size withMethod:MXThumbnailingMethodCrop];
NSString *cacheFilePath = [MXKMediaManager cachePathForMediaWithURL:thumbnailURL inFolder:kMXKMediaManagerAvatarThumbnailFolder];
// Check whether the image download is in progress
id loader = [MXKMediaManager existingDownloaderWithOutputFilePath:cacheFilePath];
if (loader) {
// Add observers
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaDownloadEnd:) name:kMXKMediaDownloadDidFinishNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaDownloadEnd:) name:kMXKMediaDownloadDidFailNotification object:nil];
} else {
// Retrieve the image from cache
UIImage* image = [MXKMediaManager loadPictureFromFilePath:cacheFilePath];
if (image) {
[self.memberThumbnailButton setImage:image forState:UIControlStateNormal];
[self.memberThumbnailButton setImage:image forState:UIControlStateHighlighted];
} else {
// Cancel potential download in progress
if (imageLoader) {
[imageLoader cancel];
}
// Add observers
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaDownloadEnd:) name:kMXKMediaDownloadDidFinishNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaDownloadEnd:) name:kMXKMediaDownloadDidFailNotification object:nil];
imageLoader = [MXKMediaManager downloadMediaFromURL:thumbnailURL andSaveAtFilePath:cacheFilePath];
}
}
} else {
UIImage *image = [UIImage imageNamed:@"default-profile"];
if (image) {
[self.memberThumbnailButton setImage:image forState:UIControlStateNormal];
[self.memberThumbnailButton setImage:image forState:UIControlStateHighlighted];
}
}
self.roomMemberMID.text = _mxRoomMember.userId;
}
- (void)onMediaDownloadEnd:(NSNotification *)notif {
// sanity check
if ([notif.object isKindOfClass:[NSString class]]) {
NSString* url = notif.object;
NSString* cacheFilePath = notif.userInfo[kMXKMediaLoaderFilePathKey];
if ([url isEqualToString:thumbnailURL] && cacheFilePath.length) {
// update the image
UIImage* image = [MXKMediaManager loadPictureFromFilePath:cacheFilePath];
if (image == nil) {
image = [UIImage imageNamed:@"default-profile"];
}
if (image) {
[self.memberThumbnailButton setImage:image forState:UIControlStateNormal];
[self.memberThumbnailButton setImage:image forState:UIControlStateHighlighted];
}
// remove the observers
[[NSNotificationCenter defaultCenter] removeObserver:self];
imageLoader = nil;
}
}
}
- (void)setRoomMember:(MXRoomMember*) aRoomMember {
// ignore useless update
if (![_mxRoomMember.userId isEqualToString:aRoomMember.userId]) {
_mxRoomMember = aRoomMember;
[self updateMemberInfo];
}
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Check user's power level before allowing an action (kick, ban, ...)
MXRoomPowerLevels *powerLevels = [mxRoom.state powerLevels];
NSUInteger memberPowerLevel = [powerLevels powerLevelOfUserWithUserID:_mxRoomMember.userId];
NSUInteger oneSelfPowerLevel = [powerLevels powerLevelOfUserWithUserID:self.mainSession.myUser.userId];
[buttonsTitles removeAllObjects];
// Consider the case of the user himself
if ([_mxRoomMember.userId isEqualToString:self.mainSession.myUser.userId]) {
[buttonsTitles addObject:@"Leave"];
if (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomPowerLevels]) {
[buttonsTitles addObject:@"Set Power Level"];
}
} else if (_mxRoomMember) {
// Offer voip call options
[buttonsTitles addObject:@"Start Voice Call"];
[buttonsTitles addObject:@"Start Video Call"];
// Consider membership of the selected member
switch (_mxRoomMember.membership) {
case MXMembershipInvite:
case MXMembershipJoin: {
// Check conditions to be able to kick someone
if (oneSelfPowerLevel >= [powerLevels kick] && oneSelfPowerLevel >= memberPowerLevel) {
[buttonsTitles addObject:@"Kick"];
}
// Check conditions to be able to ban someone
if (oneSelfPowerLevel >= [powerLevels ban] && oneSelfPowerLevel >= memberPowerLevel) {
[buttonsTitles addObject:@"Ban"];
}
break;
}
case MXMembershipLeave: {
// Check conditions to be able to invite someone
if (oneSelfPowerLevel >= [powerLevels invite]) {
[buttonsTitles addObject:@"Invite"];
}
// Check conditions to be able to ban someone
if (oneSelfPowerLevel >= [powerLevels ban] && oneSelfPowerLevel >= memberPowerLevel) {
[buttonsTitles addObject:@"Ban"];
}
break;
}
case MXMembershipBan: {
// Check conditions to be able to unban someone
if (oneSelfPowerLevel >= [powerLevels ban] && oneSelfPowerLevel >= memberPowerLevel) {
[buttonsTitles addObject:@"Unban"];
}
break;
}
default: {
break;
}
}
// update power level
if (oneSelfPowerLevel >= [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kMXEventTypeStringRoomPowerLevels]) {
[buttonsTitles addObject:@"Set Power Level"];
}
// offer to start a new chat only if the room is not a 1:1 room with this user
// it does not make sense : it would open the same room
MXRoom* room = [self.mainSession privateOneToOneRoomWithUserId:_mxRoomMember.userId];
if (!room || (![room.state.roomId isEqualToString:mxRoom.state.roomId])) {
[buttonsTitles addObject:@"Start Chat"];
}
}
return (buttonsTitles.count + 1) / 2;
}
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.tableView == aTableView) {
NSInteger row = indexPath.row;
RoomMemberActionsCell* memberActionsCell = (RoomMemberActionsCell*)[aTableView dequeueReusableCellWithIdentifier:@"MemberActionsCell" forIndexPath:indexPath];
NSString* leftTitle = nil;
NSString* rightTitle = nil;
if ((row * 2) < buttonsTitles.count) {
leftTitle = [buttonsTitles objectAtIndex:row * 2];
}
if (((row * 2) + 1) < buttonsTitles.count) {
rightTitle = [buttonsTitles objectAtIndex:(row * 2) + 1];
}
[memberActionsCell setLeftButtonText:leftTitle];
[memberActionsCell setRightButtonText:rightTitle];
return memberActionsCell;
}
return nil;
}
#pragma mark - button management
- (BOOL)hasPendingAction {
return nil != pendingMaskSpinnerView;
}
- (void)addPendingActionMask {
// add a spinner above the tableview to avoid that the user tap on any other button
pendingMaskSpinnerView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
pendingMaskSpinnerView.backgroundColor = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:0.5];
pendingMaskSpinnerView.frame = self.tableView.frame;
pendingMaskSpinnerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
// append it
[self.tableView.superview addSubview:pendingMaskSpinnerView];
// animate it
[pendingMaskSpinnerView startAnimating];
}
- (void)removePendingActionMask {
if (pendingMaskSpinnerView) {
[pendingMaskSpinnerView removeFromSuperview];
pendingMaskSpinnerView = nil;
[self.tableView reloadData];
}
}
- (void)setUserPowerLevel:(MXRoomMember*)roomMember to:(NSUInteger)value {
NSUInteger currentPowerLevel = [self.mxRoom.state.powerLevels powerLevelOfUserWithUserID:roomMember.userId];
// check if the power level has not yet been set to 0
if (value != currentPowerLevel) {
__weak typeof(self) weakSelf = self;
[weakSelf addPendingActionMask];
// Reset user power level
[self.mxRoom setPowerLevelOfUserWithUserID:roomMember.userId powerLevel:value success:^{
[weakSelf removePendingActionMask];
} failure:^(NSError *error) {
[weakSelf removePendingActionMask];
NSLog(@"[MemberVC] Set user power (%@) failed: %@", roomMember.userId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
}
}
- (void)updateUserPowerLevel:(MXRoomMember*)roomMember {
__weak typeof(self) weakSelf = self;
// Ask for the power level to set
self.actionMenu = [[MXKAlert alloc] initWithTitle:@"Power Level" message:nil style:MXKAlertStyleAlert];
if (![self.mainSession.myUser.userId isEqualToString:roomMember.userId]) {
self.actionMenu.cancelButtonIndex = [self.actionMenu addActionWithTitle:@"Reset to default" style:MXKAlertActionStyleDefault handler:^(MXKAlert *alert) {
weakSelf.actionMenu = nil;
[weakSelf setUserPowerLevel:roomMember to:weakSelf.mxRoom.state.powerLevels.usersDefault];
}];
}
[self.actionMenu addTextFieldWithConfigurationHandler:^(UITextField *textField) {
textField.secureTextEntry = NO;
textField.text = [NSString stringWithFormat:@"%tu", [weakSelf.mxRoom.state.powerLevels powerLevelOfUserWithUserID:roomMember.userId]];
textField.placeholder = nil;
textField.keyboardType = UIKeyboardTypeDecimalPad;
}];
[self.actionMenu addActionWithTitle:@"OK" style:MXKAlertActionStyleDefault handler:^(MXKAlert *alert) {
UITextField *textField = [alert textFieldAtIndex:0];
weakSelf.actionMenu = nil;
if (textField.text.length > 0) {
[weakSelf setUserPowerLevel:roomMember to:[textField.text integerValue]];
}
}];
[self.actionMenu showInViewController:self];
}
- (IBAction)onButtonToggle:(id)sender {
if ([sender isKindOfClass:[UIButton class]]) {
// already a pending action
if ([self hasPendingAction]) {
return;
}
NSString* text = ((UIButton*)sender).titleLabel.text;
if ([text isEqualToString:@"Leave"]) {
[self addPendingActionMask];
[self.mxRoom leave:^{
[self removePendingActionMask];
[self withdrawViewControllerAnimated:YES completion:nil];
} failure:^(NSError *error) {
[self removePendingActionMask];
NSLog(@"[MemberVC] Leave room %@ failed: %@", mxRoom.state.roomId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else if ([text isEqualToString:@"Set Power Level"]) {
[self updateUserPowerLevel:_mxRoomMember];
} else if ([text isEqualToString:@"Kick"]) {
[self addPendingActionMask];
[mxRoom kickUser:_mxRoomMember.userId
reason:nil
success:^{
[self removePendingActionMask];
// Pop/Dismiss the current view controller if the left members are hidden
if (![[MXKAppSettings standardAppSettings] showLeftMembersInRoomMemberList]) {
[self withdrawViewControllerAnimated:YES completion:nil];
}
}
failure:^(NSError *error) {
[self removePendingActionMask];
NSLog(@"[MemberVC] Kick %@ failed: %@", _mxRoomMember.userId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else if ([text isEqualToString:@"Ban"]) {
[self addPendingActionMask];
[mxRoom banUser:_mxRoomMember.userId
reason:nil
success:^{
[self removePendingActionMask];
}
failure:^(NSError *error) {
[self removePendingActionMask];
NSLog(@"[MemberVC] Ban %@ failed: %@", _mxRoomMember.userId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else if ([text isEqualToString:@"Invite"]) {
[self addPendingActionMask];
[mxRoom inviteUser:_mxRoomMember.userId
success:^{
[self removePendingActionMask];
}
failure:^(NSError *error) {
[self removePendingActionMask];
NSLog(@"[MemberVC] Invite %@ failed: %@", _mxRoomMember.userId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else if ([text isEqualToString:@"Unban"]) {
[self addPendingActionMask];
[mxRoom unbanUser:_mxRoomMember.userId
success:^{
[self removePendingActionMask];
}
failure:^(NSError *error) {
[self removePendingActionMask];
NSLog(@"[MemberVC] Unban %@ failed: %@", _mxRoomMember.userId, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else if ([text isEqualToString:@"Start Chat"]) {
[self addPendingActionMask];
[[AppDelegate theDelegate] startPrivateOneToOneRoomWithUserId:_mxRoomMember.userId];
} else {
BOOL startVideoCall = [text isEqualToString:@"Start Video Call"];
if (startVideoCall || [text isEqualToString:@"Start Voice Call"]) {
[self addPendingActionMask];
MXRoom* oneToOneRoom = [self.mainSession privateOneToOneRoomWithUserId:_mxRoomMember.userId];
// Place the call directly if the room exists
if (oneToOneRoom) {
[self.mainSession.callManager placeCallInRoom:oneToOneRoom.state.roomId withVideo:startVideoCall];
[self removePendingActionMask];
} else {
// Create a new room
[self.mainSession createRoom:nil
visibility:kMXRoomVisibilityPrivate
roomAlias:nil
topic:nil
success:^(MXRoom *room) {
// Add the user
[room inviteUser:_mxRoomMember.userId success:^{
// Delay the call in order to be sure that the room is ready
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainSession.callManager placeCallInRoom:room.state.roomId withVideo:startVideoCall];
[self removePendingActionMask];
});
} failure:^(NSError *error) {
NSLog(@"[MemberVC] %@ invitation failed (roomId: %@): %@", _mxRoomMember.userId, room.state.roomId, error);
[self removePendingActionMask];
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} failure:^(NSError *error) {
NSLog(@"[MemberVC] Create room failed: %@", error);
[self removePendingActionMask];
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
}
}
}
}
}
@end

View file

@ -15,31 +15,39 @@
*/
#import "RoomMembersViewController.h"
#import "MemberViewController.h"
#import "AppDelegate.h"
#import "RageShakeManager.h"
@interface RoomMembersViewController () {
// Keep reference on the current member view controller to release it correctly
MemberViewController *currentMemberViewController;
// The selected member
@interface RoomMembersViewController ()
{
/**
The selected member
*/
MXRoomMember *selectedMember;
/**
Keep reference on the current pushed view controller to release it correctly
*/
id destinationViewController;
}
@end
@implementation RoomMembersViewController
- (void)awakeFromNib {
- (void)awakeFromNib
{
[super awakeFromNib];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
}
- (void)viewDidLoad {
- (void)viewDidLoad
{
[super viewDidLoad];
// Setup `MXKRoomMemberListViewController` properties
@ -49,47 +57,57 @@
self.delegate = self;
}
- (void)dealloc {
if (currentMemberViewController) {
[currentMemberViewController destroy];
currentMemberViewController = nil;
}
- (void)dealloc
{
destinationViewController = nil;
selectedMember = nil;
}
- (void)didReceiveMemoryWarning {
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidAppear:(BOOL)animated {
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (currentMemberViewController) {
[currentMemberViewController destroy];
currentMemberViewController = nil;
if (destinationViewController)
{
if ([destinationViewController respondsToSelector:@selector(destroy)])
{
[destinationViewController destroy];
}
destinationViewController = nil;
}
}
#pragma mark - Segues
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([[segue identifier] isEqualToString:@"showDetails"]) {
if ([[segue destinationViewController] isKindOfClass:[MemberViewController class]]) {
if (selectedMember) {
currentMemberViewController = (MemberViewController *)[segue destinationViewController];
[currentMemberViewController addMatrixSession:self.mainSession];
currentMemberViewController.mxRoomMember = selectedMember;
currentMemberViewController.mxRoom = [self.mainSession roomWithRoomId:self.dataSource.roomId];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Keep ref on destinationViewController
destinationViewController = segue.destinationViewController;
if ([[segue identifier] isEqualToString:@"showDetails"])
{
if (selectedMember)
{
MXKRoomMemberDetailsViewController *memberViewController = destinationViewController;
// Set rageShake handler
memberViewController.rageShakeManager = [RageShakeManager sharedManager];
// Set delegate to handle start chat option
memberViewController.delegate = [AppDelegate theDelegate];
[memberViewController displayRoomMember:selectedMember withMatrixRoom:[self.mainSession roomWithRoomId:self.dataSource.roomId]];
}
}
}
#pragma mark - MXKRoomMemberListViewControllerDelegate
- (void)roomMemberListViewController:(MXKRoomMemberListViewController *)roomMemberListViewController didSelectMember:(MXRoomMember *)member {
- (void)roomMemberListViewController:(MXKRoomMemberListViewController *)roomMemberListViewController didSelectMember:(MXRoomMember *)member
{
// Report the selected member and open details view
selectedMember = member;
[self performSegueWithIdentifier:@"showDetails" sender:self];

View file

@ -15,7 +15,6 @@
*/
#import "RoomViewController.h"
#import "MemberViewController.h"
#import "MXKRoomBubbleTableViewCell.h"
@ -23,8 +22,8 @@
#import "RageShakeManager.h"
@interface RoomViewController () {
@interface RoomViewController ()
{
// Members list
id membersListener;
@ -49,7 +48,8 @@
@implementation RoomViewController
- (void)viewDidLoad {
- (void)viewDidLoad
{
[super viewDidLoad];
// Set room title view
@ -62,61 +62,74 @@
self.rageShakeManager = [RageShakeManager sharedManager];
}
- (void)didReceiveMemoryWarning {
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillAppear:(BOOL)animated {
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
// hide action
if (self.actionMenu) {
if (self.actionMenu)
{
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
if (self.roomDataSource) {
if (membersListener) {
if (self.roomDataSource)
{
if (membersListener)
{
[self.roomDataSource.room removeListener:membersListener];
membersListener = nil;
}
}
}
- (void)viewDidAppear:(BOOL)animated {
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (self.roomDataSource) {
if (self.roomDataSource)
{
// Set visible room id
[AppDelegate theDelegate].masterTabBarController.visibleRoomId = self.roomDataSource.roomId;
}
if (pushedViewController) {
if (pushedViewController)
{
// Force the pushed view controller to dispose its resources, and release associated data source if any.
MXKDataSource *dataSource;
if ([pushedViewController isKindOfClass:[MXKRoomMemberListViewController class]]) {
if ([pushedViewController isKindOfClass:[MXKRoomMemberListViewController class]])
{
dataSource = [(MXKRoomMemberListViewController*)pushedViewController dataSource];
}
if ([pushedViewController respondsToSelector:@selector(destroy)]) {
if ([pushedViewController respondsToSelector:@selector(destroy)])
{
[pushedViewController destroy];
}
pushedViewController = nil;
if (dataSource) {
if (dataSource)
{
[dataSource destroy];
}
}
}
- (void)viewDidDisappear:(BOOL)animated {
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
// Reset visible room id
@ -125,10 +138,11 @@
#pragma mark - Override MXKRoomViewController
- (void)displayRoom:(MXKRoomDataSource *)dataSource {
- (void)displayRoom:(MXKRoomDataSource *)dataSource
{
// Remove members listener (if any) before changing dataSource.
if (membersListener) {
if (membersListener)
{
[self.roomDataSource.room removeListener:membersListener];
membersListener = nil;
}
@ -136,37 +150,44 @@
[super displayRoom:dataSource];
}
- (void)onMatrixSessionChange {
- (void)onMatrixSessionChange
{
[super onMatrixSessionChange];
// Check dataSource state
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStatePreparing) {
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStatePreparing)
{
// dataSource is not ready, keep running the loading wheel
[self.activityIndicator startAnimating];
}
}
- (void)updateViewControllerAppearanceOnRoomDataSourceState {
- (void)updateViewControllerAppearanceOnRoomDataSourceState
{
[super updateViewControllerAppearanceOnRoomDataSourceState];
// Update UI by considering dataSource state
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady) {
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady)
{
// Register a listener for events that concern room members
if (!membersListener) {
if (!membersListener)
{
membersListener = [self.roomDataSource.room listenToEventsOfTypes:@[kMXEventTypeStringRoomMember] onEvent:^(MXEvent *event, MXEventDirection direction, id customObject) {
// Consider only live event
if (direction == MXEventDirectionForwards) {
if (direction == MXEventDirectionForwards)
{
// Update navigation bar items
[self updateNavigationBarButtonItems];
}
}];
}
} else {
}
else
{
// Remove members listener if any.
if (membersListener) {
if (membersListener)
{
[self.roomDataSource.room removeListener:membersListener];
membersListener = nil;
}
@ -176,26 +197,33 @@
[self updateNavigationBarButtonItems];
}
- (BOOL)isIRCStyleCommand:(NSString*)string {
- (BOOL)isIRCStyleCommand:(NSString*)string
{
// Override the default behavior for `/join` command in order to open automatically the joined room
if ([string hasPrefix:kCmdJoinRoom]) {
if ([string hasPrefix:kCmdJoinRoom])
{
// Join a room
NSString *roomAlias = [string substringFromIndex:kCmdJoinRoom.length + 1];
// Remove white space from both ends
roomAlias = [roomAlias stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// Check
if (roomAlias.length) {
[self.mainSession joinRoom:roomAlias success:^(MXRoom *room) {
// Show the room
[[AppDelegate theDelegate].masterTabBarController showRoom:room.state.roomId withMatrixSession:self.mainSession];
} failure:^(NSError *error) {
NSLog(@"[Console RoomVC] Join roomAlias (%@) failed: %@", roomAlias, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
} else {
if (roomAlias.length)
{
[self.mainSession joinRoom:roomAlias success:^(MXRoom *room)
{
// Show the room
[[AppDelegate theDelegate].masterTabBarController showRoom:room.state.roomId withMatrixSession:self.mainSession];
} failure:^(NSError *error)
{
NSLog(@"[Console RoomVC] Join roomAlias (%@) failed: %@", roomAlias, error);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
}
else
{
// Display cmd usage in text input as placeholder
self.inputToolbarView.placeholder = @"Usage: /join <room_alias>";
}
@ -204,13 +232,16 @@
return [super isIRCStyleCommand:string];
}
- (void)destroy {
if (membersListener) {
- (void)destroy
{
if (membersListener)
{
[self.roomDataSource.room removeListener:membersListener];
membersListener = nil;
}
if (self.actionMenu) {
if (self.actionMenu)
{
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
@ -218,15 +249,17 @@
[super destroy];
}
#pragma mark -
#pragma mark -
- (void)updateNavigationBarButtonItems {
- (void)updateNavigationBarButtonItems
{
// Update navigation bar buttons according to room members count
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady) {
if (self.roomDataSource.room.state.members.count == 2) {
if (!voipVoiceCallBarButtonItem || !voipVideoCallBarButtonItem) {
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady)
{
if (self.roomDataSource.room.state.members.count == 2)
{
if (!voipVoiceCallBarButtonItem || !voipVideoCallBarButtonItem)
{
voipVoiceCallButton = [UIButton buttonWithType:UIButtonTypeCustom];
voipVoiceCallButton.frame = CGRectMake(0, 0, 36, 36);
UIImage *voiceImage = [UIImage imageNamed:@"voice"];
@ -247,11 +280,15 @@
_showRoomMembersButtonItem.enabled = YES;
self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem, voipVideoCallBarButtonItem, voipVoiceCallBarButtonItem];
} else {
}
else
{
_showRoomMembersButtonItem.enabled = ([self.roomDataSource.room.state members].count != 0);
self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem];
}
} else {
}
else
{
_showRoomMembersButtonItem.enabled = NO;
self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem];
}
@ -259,15 +296,19 @@
#pragma mark - MXKDataSource delegate
- (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)actionIdentifier inCell:(id<MXKCellRendering>)cell userInfo:(NSDictionary *)userInfo {
- (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)actionIdentifier inCell:(id<MXKCellRendering>)cell userInfo:(NSDictionary *)userInfo
{
// Override default implementation in case of tap on avatar
if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAvatarView]) {
if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAvatarView])
{
selectedRoomMember = [self.roomDataSource.room.state memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]];
if (selectedRoomMember) {
if (selectedRoomMember)
{
[self performSegueWithIdentifier:@"showMemberDetails" sender:self];
}
} else {
}
else
{
// Keep default implementation for other actions
[super dataSource:dataSource didRecognizeAction:actionIdentifier inCell:cell userInfo:userInfo];
}
@ -275,13 +316,14 @@
#pragma mark - Segues
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
pushedViewController = [segue destinationViewController];
if ([[segue identifier] isEqualToString:@"showMemberList"]) {
if ([pushedViewController isKindOfClass:[MXKRoomMemberListViewController class]]) {
if ([[segue identifier] isEqualToString:@"showMemberList"])
{
if ([pushedViewController isKindOfClass:[MXKRoomMemberListViewController class]])
{
MXKRoomMemberListViewController* membersController = (MXKRoomMemberListViewController*)pushedViewController;
// Dismiss keyboard
@ -290,13 +332,19 @@
MXKRoomMemberListDataSource *membersDataSource = [[MXKRoomMemberListDataSource alloc] initWithRoomId:self.roomDataSource.roomId andMatrixSession:self.mainSession];
[membersController displayList:membersDataSource];
}
} else if ([[segue identifier] isEqualToString:@"showMemberDetails"]) {
MemberViewController* controller = pushedViewController;
if (selectedRoomMember) {
[controller addMatrixSession:self.mainSession];
controller.mxRoomMember = selectedRoomMember;
controller.mxRoom = self.roomDataSource.room;
}
else if ([[segue identifier] isEqualToString:@"showMemberDetails"])
{
if (selectedRoomMember)
{
MXKRoomMemberDetailsViewController *memberViewController = pushedViewController;
// Set rageShake handler
memberViewController.rageShakeManager = [RageShakeManager sharedManager];
// Set delegate to handle start chat option
memberViewController.delegate = [AppDelegate theDelegate];
[memberViewController displayRoomMember:selectedRoomMember withMatrixRoom:self.roomDataSource.room];
selectedRoomMember = nil;
}
}
@ -304,9 +352,10 @@
#pragma mark - Action
- (IBAction)onButtonPressed:(id)sender {
if (sender == voipVoiceCallButton || sender == voipVideoCallButton) {
- (IBAction)onButtonPressed:(id)sender
{
if (sender == voipVoiceCallButton || sender == voipVideoCallButton)
{
[self.mainSession.callManager placeCallInRoom:self.roomDataSource.roomId withVideo:(sender == voipVideoCallButton)];
}
}