element-ios/Vector/ViewController/RoomViewController.m

267 lines
8.1 KiB
Mathematica
Raw Normal View History

/*
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.
*/
2014-11-17 16:32:46 +00:00
#import "RoomViewController.h"
2014-10-14 15:56:03 +00:00
#import "AppDelegate.h"
#import "RageShakeManager.h"
2015-08-18 08:04:30 +00:00
#import "RoomInputToolbarView.h"
@interface RoomViewController ()
{
2015-08-18 14:24:48 +00:00
UIButton *menuButton;
UIView *menuView;
// Voip call options
UIButton *voipVoiceCallButton;
UIButton *voipVideoCallButton;
UIBarButtonItem *voipVoiceCallBarButtonItem;
UIBarButtonItem *voipVideoCallBarButtonItem;
// the user taps on a member thumbnail
MXRoomMember *selectedRoomMember;
2014-10-14 15:56:03 +00:00
}
@property (strong, nonatomic) MXKAlert *actionMenu;
@end
@implementation RoomViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Set room title view
[self setRoomTitleViewClass:MXKRoomTitleViewWithTopic.class];
2015-08-18 08:04:30 +00:00
// Replace the default input toolbar view.
[self setRoomInputToolbarViewClass:RoomInputToolbarView.class];
// Set rageShake handler
self.rageShakeManager = [RageShakeManager sharedManager];
2015-08-18 14:24:48 +00:00
menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
menuButton.frame = CGRectMake(0, 0, 36, 36);
UIImage *menuImage = [UIImage imageNamed:@"icon_menu"];
[menuButton setImage:menuImage forState:UIControlStateNormal];
[menuButton setImage:menuImage forState:UIControlStateHighlighted];
[menuButton addTarget:self action:@selector(onButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
CGFloat menuViewWidth = (self.view.frame.size.width > 200) ? 200 : self.view.frame.size.width;
menuView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, menuViewWidth, 132)];
menuView.backgroundColor = [UIColor redColor];
menuView.hidden = YES;
[self.view addSubview:menuView];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillAppear:(BOOL)animated
{
2014-10-13 16:53:33 +00:00
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
2014-10-13 16:53:33 +00:00
[super viewWillDisappear:animated];
// hide action
if (self.actionMenu)
{
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
2014-10-13 16:53:33 +00:00
}
- (void)viewDidAppear:(BOOL)animated
{
if (self.childViewControllers)
{
// Dispose data source defined for room member list view controller (if any)
for (id childViewController in self.childViewControllers)
{
if ([childViewController isKindOfClass:[MXKRoomMemberListViewController class]])
{
MXKRoomMemberListViewController *viewController = (MXKRoomMemberListViewController*)childViewController;
MXKDataSource *dataSource = [viewController dataSource];
[viewController destroy];
[dataSource destroy];
}
}
}
2014-10-14 15:56:03 +00:00
[super viewDidAppear:animated];
if (self.roomDataSource)
{
// Set visible room id
[AppDelegate theDelegate].masterTabBarController.visibleRoomId = self.roomDataSource.roomId;
}
2014-10-14 15:56:03 +00:00
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
// Reset visible room id
[AppDelegate theDelegate].masterTabBarController.visibleRoomId = nil;
}
#pragma mark - Override MXKRoomViewController
- (void)displayRoom:(MXKRoomDataSource *)dataSource
{
[super displayRoom:dataSource];
}
- (void)updateViewControllerAppearanceOnRoomDataSourceState
{
[super updateViewControllerAppearanceOnRoomDataSourceState];
}
- (BOOL)isIRCStyleCommand:(NSString*)string
{
// Override the default behavior for `/join` command in order to open automatically the joined room
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
{
// Display cmd usage in text input as placeholder
self.inputToolbarView.placeholder = @"Usage: /join <room_alias>";
}
return YES;
}
return [super isIRCStyleCommand:string];
}
- (void)destroy
{
if (self.actionMenu)
{
[self.actionMenu dismiss:NO];
self.actionMenu = nil;
}
[super destroy];
}
#pragma mark - MXKDataSource delegate
2014-10-15 23:34:46 +00:00
- (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])
{
2015-04-07 14:22:40 +00:00
selectedRoomMember = [self.roomDataSource.room.state memberWithUserId:userInfo[kMXKRoomBubbleCellUserIdKey]];
if (selectedRoomMember)
{
2015-04-09 22:17:15 +00:00
[self performSegueWithIdentifier:@"showMemberDetails" sender:self];
}
}
else
{
// Keep default implementation for other actions
[super dataSource:dataSource didRecognizeAction:actionIdentifier inCell:cell userInfo:userInfo];
}
}
2014-12-23 17:51:49 +00:00
#pragma mark - Segues
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Keep ref on destinationViewController
[super prepareForSegue:segue sender:sender];
id pushedViewController = [segue destinationViewController];
if ([[segue identifier] isEqualToString:@"showMemberList"])
{
if ([pushedViewController isKindOfClass:[MXKRoomMemberListViewController class]])
{
MXKRoomMemberListViewController* membersController = (MXKRoomMemberListViewController*)pushedViewController;
// Dismiss keyboard
[self dismissKeyboard];
MXKRoomMemberListDataSource *membersDataSource = [[MXKRoomMemberListDataSource alloc] initWithRoomId:self.roomDataSource.roomId andMatrixSession:self.mainSession];
[membersController displayList:membersDataSource];
}
}
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;
}
2014-12-23 17:51:49 +00:00
}
}
2015-08-18 14:24:48 +00:00
#pragma mark - MXKRoomInputToolbarViewDelegate
- (void)roomInputToolbarView:(MXKRoomInputToolbarView*)toolbarView placeCallWithVideo:(BOOL)video
{
[self.mainSession.callManager placeCallInRoom:self.roomDataSource.roomId withVideo:video];
}
#pragma mark - Action
- (IBAction)onButtonPressed:(id)sender
{
2015-08-18 14:24:48 +00:00
if (sender == menuButton)
{
2015-08-18 14:24:48 +00:00
menuView.hidden = !menuView.isHidden;
}
}
@end