/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-iphone
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#import "DevicesListView.h"
#import "PhoneMainView.h"
#import "UIDeviceCell.h"
@implementation DevicesMenuEntry
- (id)init:(LinphoneParticipantDevice *)dev isMe:(BOOL)isMe isFirst:(BOOL)first isUnique:(BOOL)unique index:(NSInteger)idx{
if ((self = [super init])) {
device = dev;
isMyself = isMe;
isFirst = first;
isUnique = unique;
index = idx;
isListOpen = FALSE;
}
return self;
}
@end
@implementation DevicesListView
#pragma mark - UICompositeViewDelegate Functions
static UICompositeViewDescription *compositeDescription = nil;
+ (UICompositeViewDescription *)compositeViewDescription {
if (compositeDescription == nil) {
compositeDescription = [[UICompositeViewDescription alloc] init:self.class
statusBar:StatusBarView.class
tabBar:TabBarView.class
sideMenu:SideMenuView.class
fullscreen:false
isLeftFragment:NO
fragmentWith:ChatsListView.class];
}
return compositeDescription;
}
- (UICompositeViewDescription *)compositeViewDescription {
return self.class.compositeViewDescription;
}
#pragma mark - ViewController Functions
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
_tableView.dataSource = self;
_tableView.delegate = self;
bctbx_list_t *participants = linphone_chat_room_get_participants(_room);
_devicesMenuEntries = [NSMutableArray array];
if (linphone_chat_room_get_capabilities(_room) & LinphoneChatRoomCapabilitiesOneToOne) {
LinphoneParticipant *firstParticipant = participants ? (LinphoneParticipant *)participants->data : NULL;
const LinphoneAddress *addr = firstParticipant ? linphone_participant_get_address(firstParticipant) : linphone_chat_room_get_peer_address(_room);
[ContactDisplay setDisplayNameLabel:_addressLabel forAddress:addr];
} else {
_addressLabel.text = [NSString stringWithUTF8String:linphone_chat_room_get_subject(_room) ?: LINPHONE_DUMMY_SUBJECT];
_addressLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%@'s devices", nil), _addressLabel.text];
}
LinphoneParticipant *participant;
for (int i=0; idisplayName = lab.text;
entry->participant = participant;
[_devicesMenuEntries addObject:entry];
bctbx_list_free(devices);
}
LinphoneParticipant *me = linphone_chat_room_get_me(_room);
bctbx_list_t *devices = linphone_participant_get_devices(me);
DevicesMenuEntry *entry = [[DevicesMenuEntry alloc] init:(LinphoneParticipantDevice *)bctbx_list_nth_data(devices, 0) isMe:TRUE isFirst:TRUE isUnique:(bctbx_list_size(devices)<2) index:bctbx_list_size(participants)];
entry->participant = me;
[_devicesMenuEntries addObject:entry];
bctbx_list_free(devices);
bctbx_list_free(participants);
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[_tableView reloadData];
}
#pragma mark - Action Functions
- (IBAction)onBackClick:(id)sender {
ChatConversationView *view = VIEW(ChatConversationView);
[PhoneMainView.instance popToView:view.compositeViewDescription];
}
#pragma mark - TableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [_devicesMenuEntries count];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
return 56.0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *kCellId = NSStringFromClass(UIDeviceCell.class);
UIDeviceCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId];
if (cell == nil) {
cell = [[UIDeviceCell alloc] initWithIdentifier:kCellId];
}
DevicesMenuEntry *entry = [_devicesMenuEntries objectAtIndex:indexPath.row];
if (entry->isFirst) {
entry->isMyself ? cell.deviceLabel.text = NSLocalizedString(@"Me", nil) : [ContactDisplay setDisplayNameLabel:cell.deviceLabel forAddress:linphone_participant_get_address(entry->participant)];
}
cell.device = entry->device;
cell.isFirst = entry->isFirst;
cell.isUnique = entry->isUnique;
cell.isListOpen = entry->isListOpen;
[cell update];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
DevicesMenuEntry *entry = [_devicesMenuEntries objectAtIndex:indexPath.row];
if (entry->isUnique || !entry->isFirst) {
if (!entry->device) {
LOGE(@"Can not call, because the device is null.");
[_tableView reloadData];
} else {
const LinphoneAddress *addr = linphone_participant_device_get_address(entry->device);
[CallManager.instance startCallWithAddr:(LinphoneAddress *)addr isSas:TRUE];
}
} else {
bctbx_list_t *devices = linphone_participant_get_devices(entry->participant);
if (entry->isListOpen) {
entry->isListOpen = FALSE;
[_devicesMenuEntries replaceObjectAtIndex:indexPath.row withObject:entry];
for (int i=0; i< bctbx_list_size(devices); i++) {
[_devicesMenuEntries removeObjectAtIndex:indexPath.row+1];
}
} else {
entry->isListOpen = TRUE;
[_devicesMenuEntries replaceObjectAtIndex:indexPath.row withObject:entry];
LinphoneParticipantDevice *device;
for (int i=0; iisMyself isFirst:FALSE isUnique:FALSE index:entry->index];
[_devicesMenuEntries insertObject:tempEntry atIndex:indexPath.row+i+1];
}
}
bctbx_list_free(devices);
[_tableView reloadData];
}
}
@end