Add voip call options in one to one room

This commit is contained in:
giomfo 2015-05-12 14:10:37 +02:00
parent e74a59904c
commit 0e0a84dfd0
4 changed files with 98 additions and 43 deletions

View file

@ -57,6 +57,8 @@
F0CEA5AF19E6895E00E47915 /* tab_recents.png in Resources */ = {isa = PBXBuildFile; fileRef = F0CEA5AD19E6895E00E47915 /* tab_recents.png */; }; 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 */; }; F0CEA5B119E6898800E47915 /* tab_home.ico in Resources */ = {isa = PBXBuildFile; fileRef = F0CEA5B019E6898800E47915 /* tab_home.ico */; };
F0D3C30F1A01330F0000D49E /* SettingsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D3C30E1A01330F0000D49E /* SettingsTableViewCell.m */; }; 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 */; }; F0E84D401A1F9AEC005F2E42 /* RecentsTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = F0E84D3F1A1F9AEC005F2E42 /* RecentsTableViewCell.m */; };
F0F148A81AB1BF01005F5D4A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F148A71AB1BF01005F5D4A /* AudioToolbox.framework */; }; F0F148A81AB1BF01005F5D4A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0F148A71AB1BF01005F5D4A /* AudioToolbox.framework */; };
F0F535BB1ACD6C4F00B603F8 /* RageShakeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F0F535BA1ACD6C4F00B603F8 /* RageShakeManager.m */; }; 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 = "<group>"; }; F0CEA5B019E6898800E47915 /* tab_home.ico */ = {isa = PBXFileReference; lastKnownFileType = image.ico; path = tab_home.ico; sourceTree = "<group>"; };
F0D3C30D1A01330F0000D49E /* SettingsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsTableViewCell.h; sourceTree = "<group>"; }; F0D3C30D1A01330F0000D49E /* SettingsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsTableViewCell.h; sourceTree = "<group>"; };
F0D3C30E1A01330F0000D49E /* SettingsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsTableViewCell.m; sourceTree = "<group>"; }; F0D3C30E1A01330F0000D49E /* SettingsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsTableViewCell.m; sourceTree = "<group>"; };
F0DB1ABD1B01E4AB00A3FA54 /* video.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = video.png; sourceTree = "<group>"; };
F0DB1ABE1B01E4AB00A3FA54 /* voice.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voice.png; sourceTree = "<group>"; };
F0E84D3E1A1F9AEC005F2E42 /* RecentsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentsTableViewCell.h; sourceTree = "<group>"; }; F0E84D3E1A1F9AEC005F2E42 /* RecentsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecentsTableViewCell.h; sourceTree = "<group>"; };
F0E84D3F1A1F9AEC005F2E42 /* RecentsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecentsTableViewCell.m; sourceTree = "<group>"; }; F0E84D3F1A1F9AEC005F2E42 /* RecentsTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RecentsTableViewCell.m; sourceTree = "<group>"; };
F0F148A71AB1BF01005F5D4A /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 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 */ = { F01628B519E298710071C473 /* Assets */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
F0DB1ABD1B01E4AB00A3FA54 /* video.png */,
F0DB1ABE1B01E4AB00A3FA54 /* voice.png */,
710CC3BE1A6E9F14006EE973 /* matrixUser.png */, 710CC3BE1A6E9F14006EE973 /* matrixUser.png */,
F030974A1A6580D70090BC00 /* icon_keyboard.png */, F030974A1A6580D70090BC00 /* icon_keyboard.png */,
F030974B1A6580D70090BC00 /* icon_keyboard@2x.png */, F030974B1A6580D70090BC00 /* icon_keyboard@2x.png */,
@ -489,8 +495,10 @@
F0CEA5AE19E6895E00E47915 /* logoHighRes.png in Resources */, F0CEA5AE19E6895E00E47915 /* logoHighRes.png in Resources */,
F0F90C691A32596700455977 /* icon_search.png in Resources */, F0F90C691A32596700455977 /* icon_search.png in Resources */,
F0CEA5B119E6898800E47915 /* tab_home.ico in Resources */, F0CEA5B119E6898800E47915 /* tab_home.ico in Resources */,
F0DB1ABF1B01E4AB00A3FA54 /* video.png in Resources */,
3198D9E11A68338B00556695 /* Localizable.strings in Resources */, 3198D9E11A68338B00556695 /* Localizable.strings in Resources */,
F07A80E619DD9DE700B621A1 /* Images.xcassets in Resources */, F07A80E619DD9DE700B621A1 /* Images.xcassets in Resources */,
F0DB1AC01B01E4AB00A3FA54 /* voice.png in Resources */,
F08B6FCC1A1DE7F80094A35B /* matrixConsole.jpg in Resources */, F08B6FCC1A1DE7F80094A35B /* matrixConsole.jpg in Resources */,
F04B2DA61A977A9B00EEA4C8 /* tab_settings@2x.png in Resources */, F04B2DA61A977A9B00EEA4C8 /* tab_settings@2x.png in Resources */,
); );

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

View file

@ -28,9 +28,14 @@
@interface RoomViewController () { @interface RoomViewController () {
// Members list // Members list
NSArray *members;
id membersListener; id membersListener;
// Voip call options
UIButton *voipVoiceCallButton;
UIButton *voipVideoCallButton;
UIBarButtonItem *voipVoiceCallBarButtonItem;
UIBarButtonItem *voipVideoCallBarButtonItem;
// the user taps on a member thumbnail // the user taps on a member thumbnail
MXRoomMember *selectedRoomMember; MXRoomMember *selectedRoomMember;
} }
@ -66,37 +71,6 @@
- (void)viewWillAppear:(BOOL)animated { - (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear: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 { - (void)viewWillDisappear:(BOOL)animated {
@ -112,7 +86,7 @@
self.roomDataSource.partialTextMessage = self.inputToolbarView.textMessage; self.roomDataSource.partialTextMessage = self.inputToolbarView.textMessage;
if (membersListener) { if (membersListener) {
[self.mxSession removeListener:membersListener]; [self.roomDataSource.room removeListener:membersListener];
membersListener = nil; membersListener = nil;
} }
} }
@ -160,16 +134,34 @@
// Update UI by considering dataSource state // Update UI by considering dataSource state
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStateReady) { 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.mxRoom = self.roomDataSource.room;
self.roomTitleView.editable = YES; self.roomTitleView.editable = YES;
self.roomTitleView.hidden = NO; 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 // Update the title except if the room has just been left
if (!self.leftRoomReasonLabel) { if (!self.leftRoomReasonLabel) {
if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStatePreparing) { if (self.roomDataSource && self.roomDataSource.state == MXKDataSourceStatePreparing) {
@ -181,18 +173,25 @@
self.roomTitleView.hidden = NO; self.roomTitleView.hidden = NO;
} }
} }
self.roomTitleView.editable = 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]; [self.roomTitleView refreshDisplay];
// Update navigation bar items
[self updateNavigationBarButtonItems];
} }
#pragma mark -
- (void)destroy { - (void)destroy {
members = nil;
if (membersListener) { if (membersListener) {
[self.roomDataSource.room removeListener:membersListener];
membersListener = nil; membersListener = nil;
} }
@ -204,6 +203,45 @@
[super destroy]; [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 #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 {
@ -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 @end