diff --git a/matrixConsole.xcodeproj/project.pbxproj b/matrixConsole.xcodeproj/project.pbxproj index 9b28ec80c..ae992722f 100644 --- a/matrixConsole.xcodeproj/project.pbxproj +++ b/matrixConsole.xcodeproj/project.pbxproj @@ -57,6 +57,8 @@ F0CEA5AF19E6895E00E47915 /* tab_recents.png in Resources */ = {isa = PBXBuildFile; fileRef = F0CEA5AD19E6895E00E47915 /* tab_recents.png */; }; F0CEA5B119E6898800E47915 /* tab_home.ico in Resources */ = {isa = PBXBuildFile; fileRef = F0CEA5B019E6898800E47915 /* tab_home.ico */; }; F0D3C30F1A01330F0000D49E /* SettingsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D3C30E1A01330F0000D49E /* SettingsTableViewCell.m */; }; + F0DB1ABF1B01E4AB00A3FA54 /* video.png in Resources */ = {isa = PBXBuildFile; fileRef = F0DB1ABD1B01E4AB00A3FA54 /* video.png */; }; + F0DB1AC01B01E4AB00A3FA54 /* voice.png in Resources */ = {isa = PBXBuildFile; fileRef = F0DB1ABE1B01E4AB00A3FA54 /* voice.png */; }; F0E84D401A1F9AEC005F2E42 /* RecentsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E84D3F1A1F9AEC005F2E42 /* RecentsTableViewCell.m */; }; F0F148A81AB1BF01005F5D4A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F148A71AB1BF01005F5D4A /* AudioToolbox.framework */; }; F0F535BB1ACD6C4F00B603F8 /* RageShakeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F0F535BA1ACD6C4F00B603F8 /* RageShakeManager.m */; }; @@ -156,6 +158,8 @@ F0CEA5B019E6898800E47915 /* tab_home.ico */ = {isa = PBXFileReference; lastKnownFileType = image.ico; path = tab_home.ico; sourceTree = ""; }; F0D3C30D1A01330F0000D49E /* SettingsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsTableViewCell.h; sourceTree = ""; }; F0D3C30E1A01330F0000D49E /* SettingsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsTableViewCell.m; sourceTree = ""; }; + F0DB1ABD1B01E4AB00A3FA54 /* video.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = video.png; sourceTree = ""; }; + F0DB1ABE1B01E4AB00A3FA54 /* voice.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voice.png; sourceTree = ""; }; F0E84D3E1A1F9AEC005F2E42 /* RecentsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentsTableViewCell.h; sourceTree = ""; }; F0E84D3F1A1F9AEC005F2E42 /* RecentsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecentsTableViewCell.m; sourceTree = ""; }; F0F148A71AB1BF01005F5D4A /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -220,6 +224,8 @@ F01628B519E298710071C473 /* Assets */ = { isa = PBXGroup; children = ( + F0DB1ABD1B01E4AB00A3FA54 /* video.png */, + F0DB1ABE1B01E4AB00A3FA54 /* voice.png */, 710CC3BE1A6E9F14006EE973 /* matrixUser.png */, F030974A1A6580D70090BC00 /* icon_keyboard.png */, F030974B1A6580D70090BC00 /* icon_keyboard@2x.png */, @@ -489,8 +495,10 @@ F0CEA5AE19E6895E00E47915 /* logoHighRes.png in Resources */, F0F90C691A32596700455977 /* icon_search.png in Resources */, F0CEA5B119E6898800E47915 /* tab_home.ico in Resources */, + F0DB1ABF1B01E4AB00A3FA54 /* video.png in Resources */, 3198D9E11A68338B00556695 /* Localizable.strings in Resources */, F07A80E619DD9DE700B621A1 /* Images.xcassets in Resources */, + F0DB1AC01B01E4AB00A3FA54 /* voice.png in Resources */, F08B6FCC1A1DE7F80094A35B /* matrixConsole.jpg in Resources */, F04B2DA61A977A9B00EEA4C8 /* tab_settings@2x.png in Resources */, ); diff --git a/matrixConsole/Assets/video.png b/matrixConsole/Assets/video.png new file mode 100644 index 000000000..16428d09a Binary files /dev/null and b/matrixConsole/Assets/video.png differ diff --git a/matrixConsole/Assets/voice.png b/matrixConsole/Assets/voice.png new file mode 100644 index 000000000..7d62a2766 Binary files /dev/null and b/matrixConsole/Assets/voice.png differ diff --git a/matrixConsole/ViewController/RoomViewController.m b/matrixConsole/ViewController/RoomViewController.m index fc8f67165..baa58d3ff 100644 --- a/matrixConsole/ViewController/RoomViewController.m +++ b/matrixConsole/ViewController/RoomViewController.m @@ -28,9 +28,14 @@ @interface RoomViewController () { // Members list - NSArray *members; id membersListener; + // Voip call options + UIButton *voipVoiceCallButton; + UIButton *voipVideoCallButton; + UIBarButtonItem *voipVoiceCallBarButtonItem; + UIBarButtonItem *voipVideoCallBarButtonItem; + // the user taps on a member thumbnail MXRoomMember *selectedRoomMember; } @@ -66,37 +71,6 @@ - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - - // Register a listener for events that concern room members - NSArray *mxMembersEvents = @[ - kMXEventTypeStringRoomMember, - kMXEventTypeStringRoomPowerLevels, - kMXEventTypeStringPresence - ]; - membersListener = [self.mxSession listenToEventsOfTypes:mxMembersEvents onEvent:^(MXEvent *event, MXEventDirection direction, id customObject) { - // consider only live event - if (direction == MXEventDirectionForwards) { - // Check the room Id (if any) - if (event.roomId && [event.roomId isEqualToString:self.roomDataSource.roomId] == NO) { - // This event does not concern the current room members - return; - } - - // Check whether no text field is editing before refreshing title view - if (!self.roomTitleView.isEditing) { - [self.roomTitleView refreshDisplay]; - } - - // refresh the - if (members.count > 0) { - // Hide potential action sheet - if (self.actionMenu) { - [self.actionMenu dismiss:NO]; - self.actionMenu = nil; - } - } - } - }]; } - (void)viewWillDisappear:(BOOL)animated { @@ -112,7 +86,7 @@ self.roomDataSource.partialTextMessage = self.inputToolbarView.textMessage; if (membersListener) { - [self.mxSession removeListener:membersListener]; + [self.roomDataSource.room removeListener:membersListener]; membersListener = nil; } } @@ -160,16 +134,34 @@ // Update UI by considering dataSource state if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady) { - // Check room members to enable/disable members button in nav bar - self.showRoomMembersButtonItem.enabled = ([self.roomDataSource.room.state members].count != 0); - self.roomTitleView.mxRoom = self.roomDataSource.room; self.roomTitleView.editable = YES; self.roomTitleView.hidden = NO; - } - else { - self.showRoomMembersButtonItem.enabled = NO; + // Register a listener for events that concern room members + if (!membersListener) { + membersListener = [self.roomDataSource.room listenToEventsOfTypes:@[kMXEventTypeStringRoomMember] onEvent:^(MXEvent *event, MXEventDirection direction, id customObject) { + + // Consider only live event + if (direction == MXEventDirectionForwards) { + + // Check the room Id (if any) + if (event.roomId && [event.roomId isEqualToString:self.roomDataSource.roomId] == NO) { + // This event does not concern the current room members + return; + } + + // Check whether no text field is editing before refreshing title view + if (!self.roomTitleView.isEditing) { + [self.roomTitleView refreshDisplay]; + } + + // Update navigation bar items + [self updateNavigationBarButtonItems]; + } + }]; + } + } else { // Update the title except if the room has just been left if (!self.leftRoomReasonLabel) { if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStatePreparing) { @@ -181,18 +173,25 @@ self.roomTitleView.hidden = NO; } } - self.roomTitleView.editable = NO; + + // Remove members listener if any. + if (membersListener) { + [self.roomDataSource.room removeListener:membersListener]; + membersListener = nil; + } } + // Finalize room title refresh [self.roomTitleView refreshDisplay]; + + // Update navigation bar items + [self updateNavigationBarButtonItems]; } -#pragma mark - - - (void)destroy { - members = nil; if (membersListener) { + [self.roomDataSource.room removeListener:membersListener]; membersListener = nil; } @@ -204,6 +203,45 @@ [super destroy]; } +#pragma mark - + +- (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) { + voipVoiceCallButton = [UIButton buttonWithType:UIButtonTypeCustom]; + voipVoiceCallButton.frame = CGRectMake(0, 0, 36, 36); + UIImage *voiceImage = [UIImage imageNamed:@"voice"]; + [voipVoiceCallButton setImage:voiceImage forState:UIControlStateNormal]; + [voipVoiceCallButton setImage:voiceImage forState:UIControlStateHighlighted]; + [voipVoiceCallButton addTarget:self action:@selector(onButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; + voipVoiceCallBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:voipVoiceCallButton]; + + voipVideoCallButton = [UIButton buttonWithType:UIButtonTypeCustom]; + voipVideoCallButton.frame = CGRectMake(0, 0, 36, 36); + UIImage *videoImage = [UIImage imageNamed:@"video"]; + [voipVideoCallButton setImage:videoImage forState:UIControlStateNormal]; + [voipVideoCallButton setImage:videoImage forState:UIControlStateHighlighted]; + [voipVideoCallButton addTarget:self action:@selector(onButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; + voipVideoCallBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:voipVideoCallButton]; + } + + _showRoomMembersButtonItem.enabled = YES; + + self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem, voipVideoCallBarButtonItem, voipVoiceCallBarButtonItem]; + } else { + _showRoomMembersButtonItem.enabled = ([self.roomDataSource.room.state members].count != 0); + self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem]; + } + } else { + _showRoomMembersButtonItem.enabled = NO; + self.navigationItem.rightBarButtonItems = @[_showRoomMembersButtonItem]; + } +} + #pragma mark - MXKDataSource delegate - (void)dataSource:(MXKDataSource *)dataSource didRecognizeAction:(NSString *)actionIdentifier inCell:(id)cell userInfo:(NSDictionary *)userInfo { @@ -392,6 +430,15 @@ } } +#pragma mark - Action + +- (IBAction)onButtonPressed:(id)sender { + + if (sender == voipVoiceCallButton || sender == voipVideoCallButton) { + [self.mxSession.callManager placeCallInRoom:self.roomDataSource.roomId withVideo:(sender == voipVideoCallButton)]; + } +} + @end