/* * 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 "UIAvatarPresence.h" @implementation UIAvatarPresence INIT_WITH_COMMON_CF { [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(onPresenceChanged:) name:kLinphoneNotifyPresenceReceivedForUriOrTel object:nil]; if (!_presenceImage) { _presenceImage = [[UIImageView alloc] init]; _presenceImage.tag = 883; [self addSubview:_presenceImage]; } CGSize s = self.frame.size; int is = MIN(s.width, s.height); // place it in bottom right corner _presenceImage.frame = CGRectMake(.5 * (s.width - is) + .7 * is, .5 * (s.height - is) + .7 * is, .2 * is, .2 * is); _presenceImage.image = [UIImage imageNamed:@"presence_unregistered"]; return self; } - (void)dealloc { [NSNotificationCenter.defaultCenter removeObserver:self]; }; - (void)setFrame:(CGRect)frame { [super setFrame:frame]; CGSize s = self.frame.size; int is = MIN(s.width, s.height); // place it in bottom right corner _presenceImage.frame = CGRectMake(.5 * (s.width - is) + .7 * is, .5 * (s.height - is) + .7 * is, .2 * is, .2 * is); } - (void)onPresenceChanged:(NSNotification *)k { LinphoneFriend *f = [[k.userInfo valueForKey:@"friend"] pointerValue]; // only consider event if it's about us if (!_friend || f != _friend) { return; } [self updatePresenceImage]; } - (void)updatePresenceImage { LinphonePresenceBasicStatus basic = _friend ? linphone_presence_model_get_basic_status(linphone_friend_get_presence_model(_friend)) : LinphonePresenceBasicStatusClosed; const LinphonePresenceModel *model = _friend ? linphone_friend_get_presence_model(_friend) : NULL; LinphonePresenceActivity *activity = model ? linphone_presence_model_get_activity(model) : NULL; LOGE(@"Friend %s status is now %s/%s since %@", _friend ? linphone_friend_get_name(_friend) : "NULL", basic == LinphonePresenceBasicStatusOpen ? "open" : "closed", activity ? linphone_presence_activity_to_string(activity) : "Unknown", [NSDate dateWithTimeIntervalSince1970:linphone_presence_model_get_timestamp(model)]); NSString *imageName; if (basic == LinphonePresenceBasicStatusClosed) { imageName = (_friend && linphone_friend_is_presence_received(_friend)) ? @"presence_away" : @"presence_unregistered"; } else if (linphone_presence_activity_get_type(activity) == LinphonePresenceActivityTV) { imageName = @"presence_online"; } else { imageName = @"presence_away"; } _presenceImage.image = [UIImage imageNamed:imageName]; } - (void)setFriend:(LinphoneFriend *) friend { _friend = friend; [self updatePresenceImage]; } @end