From 40056a9875e6a51df9d1c8903794b188d21466da Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 29 Dec 2011 16:55:44 +0100 Subject: [PATCH] Call quality indicator on audio view --- Classes/IncallViewController.h | 11 +++- Classes/IncallViewController.m | 100 +++++++++++++++++++++++--------- Resources/stat_sys_signal_0.png | Bin 0 -> 905 bytes Resources/stat_sys_signal_1.png | Bin 0 -> 597 bytes Resources/stat_sys_signal_2.png | Bin 0 -> 595 bytes Resources/stat_sys_signal_3.png | Bin 0 -> 594 bytes Resources/stat_sys_signal_4.png | Bin 0 -> 532 bytes 7 files changed, 80 insertions(+), 31 deletions(-) create mode 100644 Resources/stat_sys_signal_0.png create mode 100644 Resources/stat_sys_signal_1.png create mode 100644 Resources/stat_sys_signal_2.png create mode 100644 Resources/stat_sys_signal_3.png create mode 100644 Resources/stat_sys_signal_4.png diff --git a/Classes/IncallViewController.h b/Classes/IncallViewController.h index f185a0445..a17617aa6 100644 --- a/Classes/IncallViewController.h +++ b/Classes/IncallViewController.h @@ -22,6 +22,7 @@ #import "ConferenceCallDetailView.h" #import #include "UILinphone.h" + @class VideoViewController; @interface IncallViewController : UIViewController { @@ -76,22 +77,28 @@ BOOL mIncallViewIsReady; UIImage* verified, *unverified; + UIImage* stat_sys_signal_0, *stat_sys_signal_1, *stat_sys_signal_2, *stat_sys_signal_3, *stat_sys_signal_4; UIActionSheet* zrtpVerificationSheet; } ++ (UIImage*) stat_sys_signal_0; ++ (UIImage*) stat_sys_signal_1; ++ (UIImage*) stat_sys_signal_2; ++ (UIImage*) stat_sys_signal_3; ++ (UIImage*) stat_sys_signal_4; + -(void)displayStatus:(NSString*) message; - (IBAction)doAction:(id)sender; +(LinphoneCall*) retrieveCallAtIndex: (NSInteger) index inConference:(bool) conf; -+ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIButton*)accessoryView withCall:(LinphoneCall*) call; ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIView*)accessoryView withCall:(LinphoneCall*) call; @property (nonatomic, retain) IBOutlet UIView* controlSubView; @property (nonatomic, retain) IBOutlet UIView* padSubView; @property (nonatomic, retain) IBOutlet UIView* hangUpView; @property (nonatomic, retain) IBOutlet UIViewController* conferenceDetail; - @property (nonatomic, retain) IBOutlet UIButton* endCtrl; @property (nonatomic, retain) IBOutlet UIButton* dialer; @property (nonatomic, retain) IBOutlet UIButton* mute; diff --git a/Classes/IncallViewController.m b/Classes/IncallViewController.m index 4edef94a3..a376d0051 100644 --- a/Classes/IncallViewController.m +++ b/Classes/IncallViewController.m @@ -26,7 +26,6 @@ @implementation IncallViewController - @synthesize controlSubView; @synthesize padSubView; @synthesize hangUpView; @@ -68,6 +67,25 @@ } */ ++ (UIImage*) stat_sys_signal_0 { + return [[UIImage imageNamed:@"stat_sys_signal_0.png"] retain]; +} + ++ (UIImage*) stat_sys_signal_1 { + return [[UIImage imageNamed:@"stat_sys_signal_1.png"] retain]; +} + ++ (UIImage*) stat_sys_signal_2 { + return [[UIImage imageNamed:@"stat_sys_signal_2.png"] retain]; +} + ++ (UIImage*) stat_sys_signal_3 { + return [[UIImage imageNamed:@"stat_sys_signal_3.png"] retain]; +} + ++ (UIImage*) stat_sys_signal_4 { + return [[UIImage imageNamed:@"stat_sys_signal_4.png"] retain];; +} bool isInConference(LinphoneCall* call) { if (!call) @@ -472,7 +490,7 @@ int callCount(LinphoneCore* lc) { [self updateActive:(cell == activeCallCell) cell:cell]; } -+ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIButton*)accessoryView withCall:(LinphoneCall*) call { ++ (void) updateCellImageView:(UIImageView*)imageView Label:(UILabel*)label DetailLabel:(UILabel*)detailLabel AndAccessoryView:(UIView*)accessoryView withCall:(LinphoneCall*) call { if (call == NULL) { ms_warning("UpdateCell called with null call"); [label setText:@""]; @@ -526,9 +544,8 @@ int callCount(LinphoneCore* lc) { [detailLabel setText:ms]; [ms release]; } - + /* if (accessoryView != nil) { - /* LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); if (enc != LinphoneMediaEncryptionNone) { if (accessoryView.imageView.image == nil) { @@ -540,8 +557,8 @@ int callCount(LinphoneCore* lc) { } } else { [accessoryView setImage: (UIImage*)nil forState:UIControlStateNormal]; - }*/ - } + } + }*/ } @@ -573,7 +590,7 @@ int callCount(LinphoneCore* lc) { [self presentModalViewController:conferenceDetail animated:true]; } - + // UITableViewDataSource (required) - (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [callTableView dequeueReusableCellWithIdentifier:@"MyIdentifier"]; @@ -586,48 +603,73 @@ int callCount(LinphoneCore* lc) { } LinphoneCore* lc = [LinphoneManager getLc]; - if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) { + + if (indexPath.row == 0 && linphone_core_get_conference_size(lc) > 0) { [self updateConferenceCell:cell at:indexPath]; if (linphone_core_is_in_conference(lc)) activeCallCell = cell; - cell.accessoryView = nil; + cell.accessoryView = nil; if (linphone_core_is_in_conference(lc)) cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; else cell.accessoryType = UITableViewCellAccessoryNone; } else { - if (cell.accessoryView == nil) { - UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom]; - [b setFrame:CGRectMake(0, 0, 28, 28)]; - [b setImage:nil forState:UIControlStateNormal]; - b.backgroundColor = [UIColor clearColor]; - b.userInteractionEnabled = YES; - cell.accessoryView = b; - } LinphoneCall* call = [IncallViewController retrieveCallAtIndex:indexPath.row inConference:NO]; if (call == nil) return nil; - [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIButton*)cell.accessoryView withCall:call]; + if (cell.accessoryView == nil) { + UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 60, 28)] autorelease]; + cell.accessoryView = containerView; + } + else { + for (UIView *view in cell.accessoryView.subviews) { + [view removeFromSuperview]; + } + } + [IncallViewController updateCellImageView:cell.imageView Label:cell.textLabel DetailLabel:cell.detailTextLabel AndAccessoryView:(UIView*)cell.accessoryView withCall:call]; if (linphone_core_get_current_call(lc) == call) activeCallCell = cell; cell.accessoryType = UITableViewCellAccessoryNone; - - LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); - - UIButton* accessoryBtn = (UIButton*) cell.accessoryView; + + // Call Quality Indicator + UIImageView* callquality = [UIImageView new]; + [callquality setFrame:CGRectMake(0, 0, 28, 28)]; + if (linphone_call_get_average_quality(call) >= 4) { + [callquality setImage: [IncallViewController stat_sys_signal_4]]; + } + else if (linphone_call_get_average_quality(call) >= 3) { + [callquality setImage: [IncallViewController stat_sys_signal_3]]; + } + else if (linphone_call_get_average_quality(call) >= 2) { + [callquality setImage: [IncallViewController stat_sys_signal_2]]; + } + else if (linphone_call_get_average_quality(call) >= 1) { + [callquality setImage: [IncallViewController stat_sys_signal_1]]; + } + else { + [callquality setImage: [IncallViewController stat_sys_signal_0]]; + } + [cell.accessoryView addSubview:callquality]; + + LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)); if (enc != LinphoneMediaEncryptionNone) { + UIButton* accessoryBtn = [UIButton buttonWithType:UIButtonTypeCustom]; + [accessoryBtn setFrame:CGRectMake(30, 0, 28, 28)]; + [accessoryBtn setImage:nil forState:UIControlStateNormal]; + accessoryBtn.backgroundColor = [UIColor clearColor]; + accessoryBtn.userInteractionEnabled = YES; + if (enc == LinphoneMediaEncryptionSRTP || linphone_call_get_authentication_token_verified(call)) { [accessoryBtn setImage: verified forState:UIControlStateNormal]; } else { [accessoryBtn setImage: unverified forState:UIControlStateNormal]; } - } else { - [accessoryBtn setImage: (UIImage*)nil forState:UIControlStateNormal]; - } - - if (((UIButton*)cell.accessoryView).imageView.image != nil && linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) == LinphoneMediaEncryptionZRTP) { - [((UIButton*)cell.accessoryView) addTarget:self action:@selector(secureIconPressed:withEvent:) forControlEvents:UIControlEventTouchUpInside]; - } + [cell.accessoryView addSubview:accessoryBtn]; + + if (((UIButton*)accessoryBtn).imageView.image != nil && linphone_call_params_get_media_encryption(linphone_call_get_current_params(call)) == LinphoneMediaEncryptionZRTP) { + [((UIButton*)accessoryBtn) addTarget:self action:@selector(secureIconPressed:withEvent:) forControlEvents:UIControlEventTouchUpInside]; + } + } } cell.userInteractionEnabled = YES; diff --git a/Resources/stat_sys_signal_0.png b/Resources/stat_sys_signal_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7a04f44c498a89af7c15399c363fdfec2eb839 GIT binary patch literal 905 zcmV;419tq0P)P000>X1^@s6#OZ}&00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipu9 z3IiUJ%=f?m00Rk0L_t(Y$GuifOH@%9e$JqiE*uqRK*tc25gct6(?Sfx0u4eFO>hJi z)EvzZ5|RYn|!QW?ZEkg&h0=x$xe5?%V2~?ld!gpmyL{ z+~>UaJn!?q=Wq@qfI!4>Rf91yfQW%Hx+(z>u_yqzotJm_J7bh#vt7#C27}?p&z+qd ztwK=%kdTn@{$W`ec6~lPZfd%afGo?H_IPq06c-CRA?Z))fl;BQva*}|CJNfzewzdXIlF-uHiZ`R9h>eXE z^ZMS+h(c<)HM&r)hlg!LaaLzI9@!&>wHY7>HtKnfh?dT9$>&vBa5qsir zI8akl1Bb&QI8{~gtg{o76B9vAemOLRy88Nvjo0@i$VpaK7C7f{I-Mf0tGgR71_#4t zJw7&uo!#BAjgNRvhzOi>#KpxymSybi@1wu3Pn1E6)0Za2YQ^6Eeh?S-oai$oA`lS{ z0s&aeX2JdIM9*2wW<2ld35g35Q4~d#%wn;iwXF>a@$o^N(P$JIhU2=sy3o_xE4Yv? zEXy(&WAOX^Xl-jlOLMdM+3)wmX0u^yYwJ|*>*^}pjg4T81(k~t5v*40FSFU4;@{rJ zHKXxDH)C{kG=3i)!J3?W5C{aW3z72j^7|i`mcI1&^X!60eG@ fdabbk@$UKq2IqP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz_en%SRCwClR?TX{KoFk9C?X;X3aKp~ z#Dj{0C-ETo20n$)&=>I5m*~}#FW{-*DIkc7hzC!t6coJrZ}(f+u!#nZu|0HQ9rBr( zZ|2+C-6*HiiGF*i^an%3PqkXDEf$Nn7?76bKIEJl96 z-xI-Zx1-f+Rc5xu9-mB-NF<^MgF$3Khr{8n;F(N@(&;qKW;2>jr?g(Lb&FhBd?pp2 z_l{I5#r;7xnM_D-C{2`zD!dE?g$m(tn8(9>IEhdJWR4_?qIe?N@AurIn(cP$og|;n zQ#PCB+K(=}5wXBX0Az+?T+I3sCMT_mHNk8)n=~4Y zxD^J;kZ3w>;pF|j-BOl`8A)F$-np{`Vn9Nl_xizt-nD300000NkvXXu0mjf_UI0I literal 0 HcmV?d00001 diff --git a/Resources/stat_sys_signal_2.png b/Resources/stat_sys_signal_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd543636c9d5c71f3e3557e6552b104b1cfa3e11 GIT binary patch literal 595 zcmV-Z0<8UsP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^+`lQRCwClR=sKhK@i?MPq7eDP`H?2 zAr>muVj-lqxu@_M(pcK%CDK~?0#*S*2nZq~Vquj?K*833v){rTdzafJ=b0247zaOg z=bM?GojvV*KC|Bzo&A9r_^H)u_siw-@pL*>t`fPfzogUYhhDGuY?CAsi8cq#WHQOZ z;cy^={eI8Z>ve_OHvfBLlf>h3Ga8K|0(LweFLIvG=UFb7WApi(&1N&U*=$Tlxp4Tr zR6;M6Y&I+QgKRpTGP$7)N)cHE5jaH^VzHR;2faE8RRLs55>3+rksJ;OVUf*lw+l{E zDwSBFP!P4BOeT&@V3nEp5p)qEFBXezI2`^g6M%lk3mr0VeX*CEe_Jj;B;*i#+$1O$ zFv`rHUEA$esm*4S_4|Ec34;UDuP_G*G6B1n*6Ve#5SB1R4W+2PFu7bhoe8wnYO(Qn zEG%K6P)ICaBGTA0R4r_&K&x7)Qhdtsx|NR0HsVBm?t zmt1ZQ7b=s^M~qwWvSRG4R;#zgVsU4mNwr#Sl*{EO!!XQiyz#tL@BAt> h9GU!!PofV21_1LdQ+v_>@umO(002ovPDHLkV1g|S2jTz# literal 0 HcmV?d00001 diff --git a/Resources/stat_sys_signal_3.png b/Resources/stat_sys_signal_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4873af3bdf0566ff9b294011217c0fa8cb1feb GIT binary patch literal 594 zcmV-Y0P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz^hrcPRCwClR=a8fQ4pP7SFsRLP}rDg zA(qy`LI`4I<5&0v7HKT)QuqsLt^5J82na&JMl8g_Dv^MKt#7mE!Yp^!?D|-fA{WNN zVeXuJ&g{-z<#0IAZ!eYpU}^Zt=krgq+3aP%-#^~uDF>K3`s zd_yW>*RE75CH4bsG#ZioKxs@7EW9ifg$kiiNYsPf9E4Q>m?MayD4syJ+pX|mvtF;g zgH)?kDi({>>2#>kXjquQ+nJ~g0`zmOP$-Da@EijZm?IMeFBvb~KX~kAnNG@e?F_Sn zKrUuxk!!VDIa;k&qh7BkJjdk4F_sHv&pX+ZQmG^o;W=h!0s|8mGdXHJC)VqA8V-lT zbIj-Si9~oe5PRe0JPVU@xh#V4ZUx<#xHcY7ihOE0NuIDyF}d-G$#c+rgzaO+e&SOx zfS?BV
    >;*CclSnz3h^EojTP9~ES2n3E^2~{2|tyW6}+wHbF8qSRk1_LqX`~AMC zB}=OSF_B1o#A2~~TsS}Je#yekipy(0pMOrL(+5+oTrOA1X0xxFrs=o1;|=-0j8~yz gVe&6NiM|CG00U?;Z&CX87ytkO07*qoM6N<$f^ggiLjV8( literal 0 HcmV?d00001 diff --git a/Resources/stat_sys_signal_4.png b/Resources/stat_sys_signal_4.png new file mode 100644 index 0000000000000000000000000000000000000000..a3320cbb4fd216a1215364d7a59856dee0e1fd32 GIT binary patch literal 532 zcmV+v0_**WP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzwn;=mRCwCFRy~WtKoFh81gu0sA*WYa zTZ@QrSlaj_g01Z}Dedkz2-jMPz14vzTy1T2CkG0)YW%o;3mev$Xk4QUlOd1Eyq%Ao zjdna9>CsDj8cD5Ids{3PABV%C9EVd~*S~YQ-1}%W`og<`M>?JEG0@6nGGvmaFCIxMm9mn_Bz8di{a(qrZQE3>R%tvQQ@7it^?Gf2k>P=qu~gA+w^No% zrNSLT!Ez&6p2Ry z_NY>?*ZIfL0=pE6A;4QszFcHKK`03T)$tNWg0?4=Ei7p#?D$Av&lhdRfiV~k4}+y?eBeI7Zt<& zI%{G7SPAQzsMr|^+6`j`V;)h!K6g7l|Bu_u;Q4)Ed77%D72pcxAN%qFTem% Wt1S+j0li270000