From 352a600bbb1550078d81ea8fe39e70cc85a88665 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 18 Jan 2012 11:52:25 +0100 Subject: [PATCH] Split UI registration status indication in a separate ViewController --- Classes/FirstLoginViewController.m | 1 - Classes/InCallViewController-ipad.xib | 389 +++++++++++++++++- Classes/IncallViewController.xib | 142 ++++++- Classes/LinphoneUI/LinphoneManager.m | 3 +- Classes/PhoneViewController-ipad.xib | 83 ++-- Classes/PhoneViewController.h | 7 +- Classes/PhoneViewController.m | 93 ++++- Classes/PhoneViewController.xib | 550 +++++++++++++------------- Classes/StatusSubViewController.h | 34 ++ Classes/StatusSubViewController.m | 99 +++++ Classes/StatusSubViewController.xib | 253 ++++++++++++ Resources/startcall-gray.png | Bin 0 -> 2111 bytes Resources/status_gray.png | Bin 0 -> 948 bytes Resources/status_green.png | Bin 0 -> 1242 bytes Resources/status_offline.png | Bin 0 -> 1179 bytes Resources/status_orange.png | Bin 0 -> 1252 bytes Resources/status_red.png | Bin 0 -> 1202 bytes linphone.xcodeproj/project.pbxproj | 50 +++ submodules/linphone | 2 +- 19 files changed, 1333 insertions(+), 373 deletions(-) create mode 100644 Classes/StatusSubViewController.h create mode 100644 Classes/StatusSubViewController.m create mode 100644 Classes/StatusSubViewController.xib create mode 100644 Resources/startcall-gray.png create mode 100644 Resources/status_gray.png create mode 100644 Resources/status_green.png create mode 100644 Resources/status_offline.png create mode 100644 Resources/status_orange.png create mode 100644 Resources/status_red.png diff --git a/Classes/FirstLoginViewController.m b/Classes/FirstLoginViewController.m index 99bd808c5..ddacf0e09 100644 --- a/Classes/FirstLoginViewController.m +++ b/Classes/FirstLoginViewController.m @@ -90,7 +90,6 @@ [[NSUserDefaults standardUserDefaults] setBool:false forKey:@"enable_first_login_view_preference"]; [self.parentViewController dismissModalViewControllerAnimated:true]; [self.activityIndicator setHidden:true]; - [[LinphoneManager instance] setRegistrationDelegate:nil]; } -(void) displayRegisteringFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName onDomain:(NSString*)domain { [self.activityIndicator setHidden:false]; diff --git a/Classes/InCallViewController-ipad.xib b/Classes/InCallViewController-ipad.xib index 592a9208f..17661327c 100644 --- a/Classes/InCallViewController-ipad.xib +++ b/Classes/InCallViewController-ipad.xib @@ -43,6 +43,7 @@ 274 {768, 805} + _NS:408 @@ -70,6 +71,8 @@ 292 {{0, 1}, {320, 66}} + + 1 MSAwIDAuMDgyMzIwMjU5MDQgMC4xOAA @@ -114,6 +117,7 @@ {{224, 937}, {320, 77}} + _NS:196 @@ -131,6 +135,7 @@ 292 {{107, 70}, {106, 66}} + NO @@ -144,10 +149,6 @@ MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - NSImage - conf_merge.png - NSImage grouper.png @@ -167,6 +168,7 @@ 292 {{0, 4}, {107, 66}} + NO @@ -207,6 +209,7 @@ 292 {{0, 70}, {107, 66}} + NO @@ -232,6 +235,7 @@ 292 {{213, 70}, {107, 66}} + NO @@ -260,6 +264,7 @@ -2147483356 {{213, 70}, {107, 66}} + NO @@ -287,6 +292,7 @@ 292 {{107, 4}, {106, 66}} + NO @@ -312,6 +318,7 @@ 292 {{213, 4}, {107, 66}} + NO @@ -342,6 +349,7 @@ 292 {{107, 70}, {106, 66}} + NO @@ -371,6 +379,7 @@ {{224, 801.5}, {320, 135}} + NO @@ -386,6 +395,7 @@ 292 {{119, 251}, {82, 52}} + NO @@ -408,6 +418,7 @@ 292 {{119, 193}, {82, 52}} + 3 @@ -433,6 +444,7 @@ 292 {{31, 19}, {82, 52}} + NO @@ -455,6 +467,7 @@ 292 {{119, 19}, {82, 52}} + NO @@ -474,6 +487,7 @@ 292 {{207, 19}, {82, 52}} + NO @@ -496,6 +510,7 @@ 292 {{31, 77}, {82, 52}} + NO @@ -518,6 +533,7 @@ 292 {{119, 77}, {82, 52}} + NO @@ -540,6 +556,7 @@ 292 {{207, 77}, {82, 52}} + NO @@ -562,6 +579,7 @@ 292 {{31, 135}, {82, 52}} + NO @@ -584,6 +602,7 @@ 292 {{119, 135}, {82, 52}} + NO @@ -606,6 +625,7 @@ 292 {{207, 135}, {82, 52}} + NO @@ -628,6 +648,7 @@ 292 {{31, 193}, {82, 52}} + NO @@ -650,6 +671,7 @@ 292 {{207, 193}, {82, 52}} + NO @@ -670,6 +692,7 @@ {{178, 146}, {320, 310}} + 3 @@ -682,6 +705,7 @@ {{0, 20}, {768, 1004}} + _NS:212 @@ -1220,7 +1244,7 @@ UIAddVideoButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + UIMuteButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1244,7 +1268,357 @@ 144 - + + + + IncallViewController + UIViewController + + doAction: + id + + + doAction: + + doAction: + id + + + + UIButton + UIButton + UITableView + UIButton + UIViewController + UIButton + UIView + UIButton + UIButton + UIButton + UIButton + UIButton + UIView + UIButton + UIButton + UIButton + UIButton + UIButton + UIView + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + UIButton + VideoViewController + UIButton + + + + addCall + UIButton + + + addVideo + UIButton + + + callTableView + UITableView + + + close + UIButton + + + conferenceDetail + UIViewController + + + contacts + UIButton + + + controlSubView + UIView + + + dialer + UIButton + + + eight + UIButton + + + endCtrl + UIButton + + + five + UIButton + + + four + UIButton + + + hangUpView + UIView + + + hash + UIButton + + + mergeCalls + UIButton + + + mute + UIButton + + + nine + UIButton + + + one + UIButton + + + padSubView + UIView + + + pause + UIButton + + + seven + UIButton + + + six + UIButton + + + speaker + UIButton + + + star + UIButton + + + three + UIButton + + + two + UIButton + + + videoViewController + VideoViewController + + + zero + UIButton + + + + IBProjectSource + ./Classes/IncallViewController.h + + + + UIAddVideoButton + UIButton + + IBProjectSource + ./Classes/UIAddVideoButton.h + + + + UICamSwitch + UIButton + + preview + UIView + + + preview + + preview + UIView + + + + IBProjectSource + ./Classes/UICamSwitch.h + + + + UIDigitButton + UIButton + + IBProjectSource + ./Classes/UIDigitButton.h + + + + UIHangUpButton + UIButton + + IBProjectSource + ./Classes/UIHangUpButton.h + + + + UIMuteButton + UIToggleButton + + IBProjectSource + ./Classes/UIMuteButton.h + + + + UISpeakerButton + UIToggleButton + + IBProjectSource + ./Classes/UISpeakerButton.h + + + + UIToggleButton + UIButton + + IBProjectSource + ./Classes/UIToggleButton.h + + + + VideoViewController + UIViewController + + UIImageView + UIImageView + UIImageView + UICamSwitch + UICamSwitch + UICamSwitch + UIView + UIView + UIView + UIHangUpButton + UIHangUpButton + UIHangUpButton + UIView + UIView + UIMuteButton + UIMuteButton + UIMuteButton + UIView + UIView + UIView + UIView + + + + mCallQuality + UIImageView + + + mCallQualityLandLeft + UIImageView + + + mCallQualityLandRight + UIImageView + + + mCamSwitch + UICamSwitch + + + mCamSwitchLandLeft + UICamSwitch + + + mCamSwitchLandRight + UICamSwitch + + + mDisplay + UIView + + + mDisplayLandLeft + UIView + + + mDisplayLandRight + UIView + + + mHangUp + UIHangUpButton + + + mHangUpLandLeft + UIHangUpButton + + + mHangUpLandRight + UIHangUpButton + + + mLandscapeLeft + UIView + + + mLandscapeRight + UIView + + + mMute + UIMuteButton + + + mMuteLandLeft + UIMuteButton + + + mMuteLandRight + UIMuteButton + + + mPortrait + UIView + + + mPreview + UIView + + + mPreviewLandLeft + UIView + + + mPreviewLandRight + UIView + + + + IBProjectSource + ./Classes/VideoViewController.h + + + + 0 IBIPadFramework YES @@ -1256,10 +1630,9 @@ {106, 60} {160, 60} {106, 67} - {16, 16} {107, 67} {106, 67} - {82, 82} + {20, 20} {107, 67} {107, 67} {106, 67} diff --git a/Classes/IncallViewController.xib b/Classes/IncallViewController.xib index 3e1b63885..9a8d85d63 100644 --- a/Classes/IncallViewController.xib +++ b/Classes/IncallViewController.xib @@ -150,10 +150,6 @@ MC4xOTYwNzg0MzE0IDAuMzA5ODAzOTIxNiAwLjUyMTU2ODYyNzUAA - - NSImage - conf_merge.png - NSImage grouper.png @@ -1284,7 +1280,7 @@ UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - + com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1376,6 +1372,7 @@ callControlSubView callTableView close + conferenceDetail contacts controlSubView dialer @@ -1408,6 +1405,7 @@ UIView UITableView UIButton + UIViewController UIButton UIView UIButton @@ -1443,6 +1441,7 @@ callControlSubView callTableView close + conferenceDetail contacts controlSubView dialer @@ -1493,6 +1492,10 @@ close UIButton + + conferenceDetail + UIViewController + contacts UIButton @@ -1666,30 +1669,60 @@ YES YES + mCallQuality + mCallQualityLandLeft + mCallQualityLandRight mCamSwitch mCamSwitchLand + mCamSwitchLandLeft + mCamSwitchLandRight mDisplay mDisplayLand + mDisplayLandLeft + mDisplayLandRight mHangUp mHangUpLand + mHangUpLandLeft + mHangUpLandRight mLandscape + mLandscapeLeft + mLandscapeRight mMute mMuteLand + mMuteLandLeft + mMuteLandRight mPortrait mPreview mPreviewLand + mPreviewLandLeft + mPreviewLandRight YES + UIImageView + UIImageView + UIImageView + UICamSwitch + UICamSwitch UICamSwitch UICamSwitch UIView UIView + UIView + UIView + UIHangUpButton + UIHangUpButton UIHangUpButton UIHangUpButton UIView + UIView + UIView UIMuteButton UIMuteButton + UIMuteButton + UIMuteButton + UIView + UIView UIView UIView UIView @@ -1699,21 +1732,48 @@ YES YES + mCallQuality + mCallQualityLandLeft + mCallQualityLandRight mCamSwitch mCamSwitchLand + mCamSwitchLandLeft + mCamSwitchLandRight mDisplay mDisplayLand + mDisplayLandLeft + mDisplayLandRight mHangUp mHangUpLand + mHangUpLandLeft + mHangUpLandRight mLandscape + mLandscapeLeft + mLandscapeRight mMute mMuteLand + mMuteLandLeft + mMuteLandRight mPortrait mPreview mPreviewLand + mPreviewLandLeft + mPreviewLandRight YES + + mCallQuality + UIImageView + + + mCallQualityLandLeft + UIImageView + + + mCallQualityLandRight + UIImageView + mCamSwitch UICamSwitch @@ -1722,6 +1782,14 @@ mCamSwitchLand UICamSwitch + + mCamSwitchLandLeft + UICamSwitch + + + mCamSwitchLandRight + UICamSwitch + mDisplay UIView @@ -1730,6 +1798,14 @@ mDisplayLand UIView + + mDisplayLandLeft + UIView + + + mDisplayLandRight + UIView + mHangUp UIHangUpButton @@ -1738,10 +1814,26 @@ mHangUpLand UIHangUpButton + + mHangUpLandLeft + UIHangUpButton + + + mHangUpLandRight + UIHangUpButton + mLandscape UIView + + mLandscapeLeft + UIView + + + mLandscapeRight + UIView + mMute UIMuteButton @@ -1750,6 +1842,14 @@ mMuteLand UIMuteButton + + mMuteLandLeft + UIMuteButton + + + mMuteLandRight + UIMuteButton + mPortrait UIView @@ -1762,6 +1862,14 @@ mPreviewLand UIView + + mPreviewLandLeft + UIView + + + mPreviewLandRight + UIView + @@ -1793,7 +1901,6 @@ clavier-01-106px.png clavier-01-160px.png clavier.png - conf_merge.png contact.png grouper.png mic_active.png @@ -1805,20 +1912,19 @@ YES - {164, 104} - {164, 104} - {164, 104} + {107, 67} + {107, 67} + {107, 67} {106, 60} {160, 60} - {164, 104} - {82, 75} - {164, 104} - {164, 104} - {20, 20} - {164, 104} - {164, 104} - {164, 104} - {164, 104} + {106, 67} + {107, 67} + {106, 67} + {82, 82} + {107, 67} + {107, 67} + {106, 67} + {106, 67} {62, 54} diff --git a/Classes/LinphoneUI/LinphoneManager.m b/Classes/LinphoneUI/LinphoneManager.m index 5408fe6ca..8dcf1e4c3 100644 --- a/Classes/LinphoneUI/LinphoneManager.m +++ b/Classes/LinphoneUI/LinphoneManager.m @@ -312,6 +312,8 @@ static void linphone_iphone_call_state(LinphoneCore *lc, LinphoneCall* call, Lin } -(void) onRegister:(LinphoneCore *)lc cfg:(LinphoneProxyConfig*) cfg state:(LinphoneRegistrationState) state message:(const char*) message { + NSLog(@"NEW REGISTRATION STATE: '%s' (message: '%s')", linphone_registration_state_to_string(state), message); + LinphoneAddress* lAddress = linphone_address_new(linphone_proxy_config_get_identity(cfg)); NSString* lUserName = linphone_address_get_username(lAddress)? [[NSString alloc] initWithUTF8String:linphone_address_get_username(lAddress) ]:@""; NSString* lDisplayName = linphone_address_get_display_name(lAddress)? [[NSString alloc] initWithUTF8String:linphone_address_get_display_name(lAddress) ]:@""; @@ -345,7 +347,6 @@ static void linphone_iphone_call_state(LinphoneCore *lc, LinphoneCall* call, Lin forReason:lErrorMessage]; if (lErrorMessage != nil - && registrationDelegate==nil && linphone_proxy_config_get_error(cfg) != LinphoneReasonNoResponse) { //do not report network connection issue on registration //default behavior if no registration delegates diff --git a/Classes/PhoneViewController-ipad.xib b/Classes/PhoneViewController-ipad.xib index ca23ef6e4..54406ea07 100644 --- a/Classes/PhoneViewController-ipad.xib +++ b/Classes/PhoneViewController-ipad.xib @@ -11,7 +11,6 @@ 933 - IBUILabel IBUIViewController IBUIButton IBUIView @@ -158,7 +157,7 @@ {{573, 112.5}, {160, 231}} - + NO NO IBIPadFramework @@ -235,39 +234,6 @@ - - - 292 - {{415, 346}, {320, 29}} - - - - - 3 - MCAwAA - - NO - YES - NO - IBIPadFramework - status - - 1 - MCAwIDAAA - - - 1 - 10 - - 1 - 17 - - - Helvetica - 17 - 16 - - 292 @@ -551,6 +517,20 @@ + + + 292 + {{415, 351}, {320, 20}} + + + + _NS:212 + + 3 + MCAwAA + + IBIPadFramework + {{0, 569}, {768, 386}} @@ -739,11 +719,11 @@ - status + statusViewHolder - + - 55 + 62 @@ -798,12 +778,12 @@ - + @@ -903,9 +883,10 @@ Call-large - 21 - + 61 + + status_holder @@ -919,7 +900,6 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UICallButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIEraseButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -951,12 +931,13 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 60 + 62 @@ -985,17 +966,6 @@ PhoneViewController UIViewController - - doKeyPad: - id - - - doKeyPad: - - doKeyPad: - id - - UITextField UIButton @@ -1015,6 +985,7 @@ UIButton UIButton UILabel + UIView UIButton UIButton UIButton @@ -1093,6 +1064,10 @@ status UILabel + + statusViewHolder + UIView + switchCamera UIButton diff --git a/Classes/PhoneViewController.h b/Classes/PhoneViewController.h index 259af213d..27b93562c 100644 --- a/Classes/PhoneViewController.h +++ b/Classes/PhoneViewController.h @@ -21,13 +21,14 @@ #import "linphonecore.h" #import "UILinphone.h" #import "CallDelegate.h" +#import "StatusSubViewController.h" @class MainScreenWithVideoPreview; @class IncallViewController; @class FirstLoginViewController; -@interface PhoneViewController : UIViewController { +@interface PhoneViewController : UIViewController { @private //UI definition @@ -55,6 +56,7 @@ UIDigitButton* hash; UIButton* backToCallView; + UIView* statusViewHolder; UITabBarController* myTabBarController; @@ -62,6 +64,7 @@ FirstLoginViewController* myFirstLoginViewController; IncallViewController* mIncallViewController; MainScreenWithVideoPreview* mMainScreenWithVideoPreview; + StatusSubViewController* statusSubViewController; UIButton* switchCamera; } @@ -87,6 +90,8 @@ @property (nonatomic, retain) IBOutlet UIButton* zero; @property (nonatomic, retain) IBOutlet UIButton* hash; +@property (nonatomic, retain) IBOutlet UIView* statusViewHolder; + @property (nonatomic, retain) IBOutlet UIButton* backToCallView; @property (nonatomic, retain) IBOutlet UIButton* switchCamera; diff --git a/Classes/PhoneViewController.m b/Classes/PhoneViewController.m index a99cfe838..b1f1214a8 100644 --- a/Classes/PhoneViewController.m +++ b/Classes/PhoneViewController.m @@ -49,12 +49,54 @@ @synthesize zero; @synthesize hash; +@synthesize statusViewHolder; + @synthesize myTabBarController; @synthesize mMainScreenWithVideoPreview; @synthesize backToCallView; @synthesize switchCamera; +-(void) updateStatusSubView { + LinphoneCore* lc = 0; + @try { + lc = [LinphoneManager getLc]; + } @catch (NSException* exc) { + return; + } + + if (!lc) + return; + + BOOL enableCallButtons; + LinphoneProxyConfig* config; + linphone_core_get_default_proxy([LinphoneManager getLc], &config); + + LinphoneRegistrationState s; + NSString* m = nil; + + if (config == NULL) { + s = LinphoneRegistrationNone; + m = @"No SIP account configured"; + } else { + s = linphone_proxy_config_get_state(config); + + switch (s) { + case LinphoneRegistrationOk: m = @"Registered"; break; + case LinphoneRegistrationNone: m=@"Not registered"; break; + case LinphoneRegistrationFailed: m = @"Registration failed"; break; + case LinphoneRegistrationProgress: m = @"Registration in progress"; break; + case LinphoneRegistrationCleared: m= @"No SIP account"; break; + default: break; + } + } + + enableCallButtons = [statusSubViewController updateWithRegistrationState:s message:m]; + + [callLarge setEnabled:enableCallButtons]; + [callShort setEnabled:enableCallButtons]; + [backToCallView setEnabled:enableCallButtons]; +} -(void) updateCallAndBackButtons { @try { @@ -72,15 +114,18 @@ [exc.name cStringUsingEncoding:[NSString defaultCStringEncoding]], [exc.reason cStringUsingEncoding:[NSString defaultCStringEncoding]]); } + + [self updateStatusSubView]; } + - (void)viewDidAppear:(BOOL)animated { if ([[NSUserDefaults standardUserDefaults] boolForKey:@"enable_first_login_view_preference"] == true) { myFirstLoginViewController = [[FirstLoginViewController alloc] initWithNibName:@"FirstLoginViewController" bundle:[NSBundle mainBundle]]; - [[LinphoneManager instance] setRegistrationDelegate:myFirstLoginViewController]; [self presentModalViewController:myFirstLoginViewController animated:true]; - }; + } + [[LinphoneManager instance] setRegistrationDelegate:self]; [mMainScreenWithVideoPreview showPreview:YES]; [self updateCallAndBackButtons]; @@ -91,10 +136,10 @@ } -// Implement viewDidLoad to do additional setup after loading the view, typically from a nib : called twice (?!) +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib : may be called twice - (void)viewDidLoad { [super viewDidLoad]; - + [mDisplayName release]; mDisplayName = [UILabel alloc]; [zero initWithNumber:'0' addressField:address dtmf:false]; @@ -114,8 +159,17 @@ [erase initWithAddressField:address]; [backToCallView addTarget:self action:@selector(backToCallViewPressed) forControlEvents:UIControlEventTouchUpInside]; - mIncallViewController = [[IncallViewController alloc] initWithNibName:[LinphoneManager runningOnIpad]?@"InCallViewController-ipad":@"IncallViewController" + if (mIncallViewController == nil) + mIncallViewController = [[IncallViewController alloc] initWithNibName:[LinphoneManager runningOnIpad]?@"InCallViewController-ipad":@"IncallViewController" bundle:[NSBundle mainBundle]]; + + if (statusSubViewController == nil) { + statusSubViewController = [[StatusSubViewController alloc] initWithNibName:@"StatusSubViewController" + bundle:[NSBundle mainBundle]]; + [statusViewHolder addSubview:statusSubViewController.view]; + } + + [self updateCallAndBackButtons]; } - (void)didReceiveMemoryWarning { @@ -180,8 +234,7 @@ } //status reporting --(void) displayStatus:(NSString*) message { - [status setText:message]; +-(void) displayStatus:(NSString*) message { [mIncallViewController displayStatus:message]; } @@ -302,5 +355,31 @@ [super dealloc]; } +-(void) displayRegisteredFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName onDomain:(NSString*)domain { + if (myFirstLoginViewController != nil && self.modalViewController == myFirstLoginViewController) { + [myFirstLoginViewController displayRegisteredFromUI:viewCtrl forUser:username withDisplayName:displayName onDomain:domain]; + } + [self updateStatusSubView]; +} +-(void) displayRegisteringFromUI:(UIViewController*) viewCtrl forUser:(NSString*) username withDisplayName:(NSString*) displayName onDomain:(NSString*)domain { + if (myFirstLoginViewController != nil && self.modalViewController == myFirstLoginViewController) { + [myFirstLoginViewController displayRegisteringFromUI:viewCtrl forUser:username withDisplayName:displayName onDomain:domain]; + } + [self updateStatusSubView]; +} +-(void) displayRegistrationFailedFromUI:(UIViewController*) viewCtrl forUser:(NSString*) user withDisplayName:(NSString*) displayName onDomain:(NSString*)domain forReason:(NSString*) reason { + if (myFirstLoginViewController != nil && self.modalViewController == myFirstLoginViewController) { + [myFirstLoginViewController displayRegistrationFailedFromUI:viewCtrl forUser:user withDisplayName:displayName onDomain:domain forReason:reason]; + } + [self updateStatusSubView]; +} + +-(void) displayNotRegisteredFromUI:(UIViewController*) viewCtrl { + if (myFirstLoginViewController != nil && self.modalViewController == myFirstLoginViewController) { + [myFirstLoginViewController displayNotRegisteredFromUI:viewCtrl]; + } + [self updateStatusSubView]; +} + @end diff --git a/Classes/PhoneViewController.xib b/Classes/PhoneViewController.xib index ef1171aee..60f3013c1 100644 --- a/Classes/PhoneViewController.xib +++ b/Classes/PhoneViewController.xib @@ -12,11 +12,10 @@ YES - IBUITextField IBUIViewController IBUIButton IBUIView - IBUILabel + IBUITextField IBProxyObject @@ -51,10 +50,10 @@ 292 - {{254, 0}, {66, 65}} + {{254, 0}, {66, 81}} - + NO IBCocoaTouchFramework 0 @@ -90,10 +89,11 @@ 292 - {{5, 0}, {255, 66}} + {{0, 1}, {255, 80}} + NO NO IBCocoaTouchFramework @@ -103,9 +103,6 @@ 3 MAA - - 2 - YES 15 @@ -128,216 +125,31 @@ - {320, 65} + {320, 81} - - 1 - MC45MDE5NjA3OSAwLjkwMTk2MDc5IDAuOTAxOTYwNzkAA - + IBCocoaTouchFramework - + 292 - {{9, 390}, {304, 21}} + {255, 20} - - NO - YES - NO + + _NS:196 + + 3 + MCAwAA + IBCocoaTouchFramework - status - - 1 - MCAwIDAAA - - - 1 - 10 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 292 - {{213, 64}, {107, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 3 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - clavier-01-106px.png - - - - - - - 292 - {{0, 130}, {107, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 4 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{107, 130}, {106, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 5 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - clavier-01-108px.png - - - - - - - 292 - {{213, 130}, {107, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 6 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{0, 196}, {107, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 7 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{213, 196}, {107, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 9 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - - - - - 292 - {{107, 64}, {106, 66}} - - - - NO - NO - IBCocoaTouchFramework - 0 - 0 - 2 - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - - 292 - {{0, 64}, {107, 66}} + {{0, 81}, {107, 66}} @@ -357,83 +169,158 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + + NSImage + clavier-01-106px.png + - + 292 - {{0, 262}, {107, 66}} + {{107, 81}, {106, 66}} - + NO NO IBCocoaTouchFramework 0 0 - * + 2 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + + NSImage + clavier-01-108px.png + - + 292 - {{107, 262}, {106, 66}} + {{213, 81}, {107, 66}} - + NO NO IBCocoaTouchFramework 0 0 - 0+ + 3 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + - + 292 - {{213, 262}, {107, 66}} + {{0, 147}, {107, 66}} - + NO NO IBCocoaTouchFramework 0 0 - # + 4 1 MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + + + + + + + 292 + {{107, 147}, {106, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 5 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + + 292 + {{213, 147}, {107, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 6 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + + 292 + {{0, 213}, {107, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 7 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + 292 - {{107, 196}, {106, 66}} + {{107, 213}, {106, 66}} @@ -449,14 +336,106 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - + + + + + + + 292 + {{213, 213}, {107, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 9 + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + + 292 + {{0, 279}, {107, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + * + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + + 292 + {{107, 279}, {106, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + 0+ + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + + + + + + 292 + {{213, 279}, {107, 66}} + + + + NO + NO + IBCocoaTouchFramework + 0 + 0 + # + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + 292 - {{160, 328}, {160, 66}} + {{160, 345}, {160, 66}} @@ -490,7 +469,7 @@ 292 - {{0, 328}, {160, 66}} + {{0, 345}, {160, 66}} @@ -505,10 +484,15 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + NSImage + startcall-gray.png + NSImage startcall-green.png + @@ -516,10 +500,10 @@ 292 - {{0, 328}, {320, 66}} + {{0, 345}, {320, 66}} - + NO NO IBCocoaTouchFramework @@ -531,7 +515,9 @@ MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + @@ -541,10 +527,7 @@ - - 3 - MCAwAA - + 5 IBCocoaTouchFramework @@ -568,14 +551,6 @@ 12 - - - status - - - - 15 - view @@ -680,14 +655,6 @@ 54 - - - erase - - - - 151 - dialerView @@ -720,6 +687,22 @@ 164 + + + statusViewHolder + + + + 169 + + + + erase + + + + 151 + delegate @@ -765,23 +748,23 @@ YES - - - - - - - - - + + + + + + + + + @@ -811,11 +794,6 @@ Call-short - - 7 - - - 35 @@ -861,18 +839,12 @@ YES - + Dialer - - 150 - - - Erase - 4 @@ -891,6 +863,18 @@ Call-large + + 165 + + + status_view + + + 150 + + + Erase + @@ -909,6 +893,8 @@ 160.IBPluginDependency 162.CustomClassName 162.IBPluginDependency + 162.IBUIButtonInspectorSelectedStateConfigurationMetadataKey + 165.IBPluginDependency 29.CustomClassName 29.IBPluginDependency 30.CustomClassName @@ -936,7 +922,7 @@ 41.IBPluginDependency 5.CustomClassName 5.IBPluginDependency - 7.IBPluginDependency + 5.IBUIButtonInspectorSelectedStateConfigurationMetadataKey 80.IBPluginDependency @@ -950,7 +936,7 @@ YES - 410 + 412 1 @@ -965,6 +951,8 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UICallButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIDigitButton @@ -992,7 +980,7 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin UICallButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -1008,7 +996,7 @@ - 164 + 169 @@ -1056,17 +1044,6 @@ PhoneViewController UIViewController - - doKeyPad: - id - - - doKeyPad: - - doKeyPad: - id - - YES @@ -1089,6 +1066,7 @@ six star status + statusViewHolder switchCamera three two @@ -1114,6 +1092,7 @@ UIButton UIButton UILabel + UIView UIButton UIButton UIButton @@ -1142,6 +1121,7 @@ six star status + statusViewHolder switchCamera three two @@ -1221,6 +1201,10 @@ status UILabel + + statusViewHolder + UIView + switchCamera UIButton @@ -1290,6 +1274,7 @@ clavier-01-108px.png clavier-01-160px.png effacer.png + startcall-gray.png startcall-green.png @@ -1299,6 +1284,7 @@ {160, 60} {66, 65} {60, 52} + {60, 52} 933 diff --git a/Classes/StatusSubViewController.h b/Classes/StatusSubViewController.h new file mode 100644 index 000000000..72e4997eb --- /dev/null +++ b/Classes/StatusSubViewController.h @@ -0,0 +1,34 @@ +/* StatusSubViewController.h + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +#import +#include "linphonecore.h" + +@interface StatusSubViewController : UIViewController { + UIImageView* image; + UIActivityIndicatorView* spinner; + UILabel* label; +} + +@property (nonatomic, retain) IBOutlet UIImageView* image; +@property (nonatomic, retain) IBOutlet UIActivityIndicatorView* spinner; +@property (nonatomic, retain) IBOutlet UILabel* label; + +-(BOOL) updateWithRegistrationState:(LinphoneRegistrationState)state message:(NSString*) message; + +@end diff --git a/Classes/StatusSubViewController.m b/Classes/StatusSubViewController.m new file mode 100644 index 000000000..e0d1cadcb --- /dev/null +++ b/Classes/StatusSubViewController.m @@ -0,0 +1,99 @@ +/* StatusSubViewController.h + * + * Copyright (C) 2011 Belledonne Comunications, Grenoble, France + * + * 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 2 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#import "StatusSubViewController.h" + +@implementation StatusSubViewController + +@synthesize image; +@synthesize spinner; +@synthesize label; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +-(BOOL) updateWithRegistrationState:(LinphoneRegistrationState)state message:(NSString*) message { + + switch(state) { + case LinphoneRegistrationCleared: + image.hidden = NO; + [image setImage:[UIImage imageNamed:@"status_orange.png"]]; + [spinner stopAnimating]; + [label setText:message != nil ? message : NSLocalizedString(@"No SIP account defined", nil)]; + return YES; + case LinphoneRegistrationFailed: + image.hidden = NO; + [image setImage:[UIImage imageNamed:@"status_red.png"]]; + [spinner stopAnimating]; + [label setText:message]; + return NO; + case LinphoneRegistrationNone: + image.hidden = NO; + [image setImage:[UIImage imageNamed:@"status_gray.png"]]; + [spinner stopAnimating]; + [label setText:message]; + return NO; + case LinphoneRegistrationProgress: + image.hidden = YES; + spinner.hidden = NO; + [spinner startAnimating]; + [label setText:message]; + return NO; + case LinphoneRegistrationOk: + image.hidden = NO; + [image setImage:[UIImage imageNamed:@"status_green.png"]]; + [spinner stopAnimating]; + [label setText:message]; + return YES; + } + return NO; +} + +@end diff --git a/Classes/StatusSubViewController.xib b/Classes/StatusSubViewController.xib new file mode 100644 index 000000000..12478957f --- /dev/null +++ b/Classes/StatusSubViewController.xib @@ -0,0 +1,253 @@ + + + + 1280 + 11C74 + 1938 + 1138.23 + 567.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 933 + + + IBUIImageView + IBUIActivityIndicatorView + IBUIView + IBUILabel + IBProxyObject + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + + + 292 + {{0, -1}, {25, 23}} + + + + _NS:567 + NO + IBCocoaTouchFramework + + NSImage + status_orange.png + + + + + -2147483356 + {{0, 1}, {20, 20}} + + + + _NS:1030 + NO + IBCocoaTouchFramework + 2 + + + + 292 + {{28, 0}, {280, 21}} + + + + _NS:328 + NO + YES + 7 + NO + IBCocoaTouchFramework + No SIP account defined + + 3 + MC42NjY2NjY2NjY3AA + + + 1 + 10 + + 1 + 17 + + + Helvetica + 17 + 16 + + + + {255, 23} + + + + _NS:196 + + 3 + MCAwAA + + IBCocoaTouchFramework + + + + + + + image + + + + 8 + + + + label + + + + 9 + + + + spinner + + + + 10 + + + + view + + + + 11 + + + + + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + + + + + + status_view + + + 7 + + + status_spin + + + 6 + + + status_label + + + 5 + + + status_image + + + + + StatusSubViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 11 + + + + + StatusSubViewController + UIViewController + + UIImageView + UILabel + UIActivityIndicatorView + + + + image + UIImageView + + + label + UILabel + + + spinner + UIActivityIndicatorView + + + + IBProjectSource + ./Classes/StatusSubViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + + status_orange.png + {25, 23} + + 933 + + diff --git a/Resources/startcall-gray.png b/Resources/startcall-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..360e7baa0f60715e52647ceeefa55b8f8a059816 GIT binary patch literal 2111 zcmV-F2*CG=P)00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy0%A)?L;(MXkIcUS000SaNLh0L01ejw01ejxLMWSf000L#Nkl+R_ukKlI^UxxY!4V8E-jq6Gy>qz%Bwv63J5-^F^lPd|Wx=MHmg}4a- z&?Mc=+pbu|zT4PxEQDxA_?q1w7x=BD)Nx4@#gXnC2mHaECZ>vMK_Z`5F8EK$$Cdxd zhXRK(nsZd6b#+Sc0anPy*}70eZ`k|nW2kG!i1&$e#R+1f2scD%-)<=ILxBug|CZb3 zJ<2D6-N7_chzBq*s-uskS#d^O=}KCZuu2#!KmY{=)qe#DP!Wczf5KWho#m_fp_p+* z4s=YgcM+;^J+&dN-!PBl9Ed5Mp?Bf{dq$C$kPASM&p-+$I%GpyF2oYHqs-qY*po-L zA_agMUu4uohZ#uAiC98ki`GSeJym42+1x}45Khtq^r&!J_?eti{YX>YEK?n(j#kI2 zS*oD9z+!QaB{%j8t|MKW@EGSO1PJGZ-Spq2VRCD%Uf)d(Pf>Hj^VCr>18!=i(G!51 zhTf;KhBt_ZMK616Nf2?#hB3hh@i4i@(f9#dT-p%>?46Bz&W&S2vG{&b%+Yg}ssv#X z%Jn7EE{EvMRlhiZeb=%hNYix;HHl@#-4_Qnq>f%FAZu}Ll;N;&$IA97uy;HDs%w5l zp0vAvP(#+Hx}L*|sMTaIrbz)C*gFFTssodyZ!Zn2hq3@$ks6`gCOu>nDFCoay{01X z@?ZgJC!K;b5y}GZgIvVE$?S8zRx3Rgf7fwDorO;^%%@o=gFfZCfe9m^lJ4Y| z$SsvMkZD}Z=`NhbPyk>ixO4x&GsuW|Y!8uoM|uX);% z_}<yvW6t$Wv1}!K$b9hI zgNrS7{pfqycdHYE{OITow?>ocoPL*f5Lm|aRf!%MG=3>Ji9ENH9f*#y8UI9M=s@`? zvt2gXifD%zvZSB1qBoJXm`C3pHFNb@0#v62PGGP$p6=S^wljz?gKgLDQ4Z3D|3gLx z(lOTYn%E%CFpAy+Sl5_WrAGh?6n9~r9x;R!uiNHt$(fYtSPbWTL<(*}4rUh9eW&($S6|NK-;%ahJWF?>1JCA!hX;CK*dFH!WUCB)i1v zX4DW5x*r{J;9~w+yVTLH74TRIC$y8ClH*2&S`C*5FqhVIIe-bm7w2m(T;D&eXJXf9 z*u-Hw*lY_Mm2Ub-2-La@xu}7VvQw`4WnYdOCs7;Va?G*yeS+OvdWdi1@CG*Ii!X@j z8eBwB%VnLG|E28o@0-=r2XX|Phb734P&bkVk;e$f#MBqp40u7z(;}A5j{-TQ{2+hh z|5`aJx2f%_-`x$!16)aL2pNu%7>%hI8P!=2S<|_$vbR)(U7B;n4dQs0nY~kZ2N3t= z;zK+keeY!GC8fw{=WIOgpDvR~s2_18MpV4Ve5HG1nfpu|x7?yERr2HvBXgyaO0~50000bbVXQnWMOn=I%9HWVRU5x zGB7bQEio`HGB8vzFgi6gIy5;eFfuwYFm0ffTmS$7C3HntbYx+4WjbwdWNBu305UK! pF)cALEiy1vF)%tcH99moD=;!TFfbhbE#LqE002ovPDHLkV1m&0&FKID literal 0 HcmV?d00001 diff --git a/Resources/status_gray.png b/Resources/status_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f871f3eb278503e10417f466b765eb306a1c52 GIT binary patch literal 948 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoZ!2%>hUg^vLQY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|6p}rHd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_HU8X#UUXIG#NP=YDR z+ueoXe|!I#{XiaPfk$L9(Aw)D%;=;sy8@_Ut*47)h{frtlf6Ac0ws>uKRG`&swA`a|spd8=2<1^;G$UKmj-eDtum#aHo5 zZ#<)(&0U(w*_oFAA^Sn(gUp3%mv<>`o80j*(aHvAE7S5ufiM6J<$&Bo})T^Y0R zKz{H2wN-`@D*lU_DwgWqGSMLJDul!T=>`b4r|Meg$BLnMQab(IS8_5opzbn!soE9 zsh@>m(qjF|$F0JwUvKFMz2;_a;Qdg$@R!Piq%Z3y8K#==_)UL4U3 zJ2b)1y5UZ>O`XW*nGy9`oZ^m!?&8u6fKJS9W6WXOLvkP z+=b@;EYjvKbPeV{x!NoArg*Yh|A$L&?yE6KovLj&t+~Es(aLA*?RGw&pe5_|J-~e@ zubWxA=d)Ui)ixqGS=LR@XnS_a>Auw2&oAdD-(Hj6;q|GZe9gCdg z|NlvdiszCG5u9NA>7+w?X~mY~{)hj(TD6hs?POqTRxNRjC`m~yNwrEYN(E93Mh1pP zx(0^2h87`)##Sb#Rt6^828LD!2EIE?gi$o)=BH$)Rl+qGScVuHSs7YdnOZ_LbUoCW Q0Mx+X>FVdQ&MBb@00)?icK`qY literal 0 HcmV?d00001 diff --git a/Resources/status_green.png b/Resources/status_green.png new file mode 100644 index 0000000000000000000000000000000000000000..1a39a42427823dbb36531709ed9ba198ffddaed8 GIT binary patch literal 1242 zcmV<01SR{4P)P000*V1^@s6{^R5m00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RV1QibqBj~v8#{d8XY)M2xR7l6Q zm0N67RTPH5z0XW%&RhxtH56hLm=c3+fzm58nxa7^YP_YGATer8z<41|cu@jAn3!Oq zi4aAM2|l1iKut{K0U{Dhi__^Kw9^VsTPQSu6bg1O=X5S-`!G|O0)^D*dO9a(o&Vcw z?X~|6|5G$}cxQ|~+x|=8hBkD~?rc(swJ9>YfUS3gyn4d#t#H-^<~qvf`J9y{rA7Bl zi<+I6`;G1k(PY=}gCm_szo-tU13|}pq+FxmWd+lKlqR*OC$2;xmUigRmDp!BPotzx z7ap5idU0tkl2!~On;>DuFjSl?_GH2z()$!t0OGm?`&z2vL$`!H6m-tXc8Fa-om+Zv zNe{a8plfbi(!<}GVGJvdkxh`a5+t*6H&A(V55!l6Z`UA!4!tgG@gs1zT@>Mxo@2Vr zeZY<9kk>ZlggsS!Ih{GB8zg2VRBTbgiY+y)__M&w8wlBKR{S;&2~ZpKPPfZU1ehtH zt5}=*=Dw=)zusx1n|7m}o8x*+q23ozbzM~aVQJQiwkmVr8pI#c_X5uY-(7VXtGXW` zHL0;u2!GhM2Bo$D_8dv{xb4Z>{R>G*e^{^20aW+D0_2veTC0hN#8dh< z0Exwm`Nh092JnaV`uZcz`zFh3sWpFAO1)9A7pogWuEi2qlG`lf06?JK^%NFIG@I!2 zx9eZ~596H-sIAuA0b>6cN1|Sl2ugu-!Fomjlu+yQ2@=679Im~Stw>30b3rwY62%Mw z#RWODZ)o?_+j`V5*d9FUDH&JI67wK1kUyC7Byd52dr8M#Q}VLkj$ak)CIa|F&TVOr z9<#F9i~f)v^SA3O3qBtkJBw051h6@jxf~#qO>RbTykI<=8@usLFjg-B&iso9As#KT zmaz_;l~S-L-@6S>yPLFNJtIQn(*XiO$NZdDLDh=$ z04t(61Y$9OQ2ZoqG2?p#rzP5=;st}709vZzL#8kql;R^`6qv3AZ==LPyUbkjhjgW+ zJW0-R$KsL{)((K!6@4wJVn7KiyImeyhN%?m-I^DtbZ`9lRC6;xxSC{Jt+C!p+h-xf z>p&~q@}Lf*)R$6-%EL8ge?!>eQ-Y28mhEh*PxV~0=Vy-l-tjrgKk(@l_?+cG-0P}Z zQ|2ujx^a@s;-WHX+2#wSG@*$BLnS-I)uaIeA!nl!Vke5(K(Cdy*Bx0pGAs&3HvPGJ zolh_S(5F`v&2yFyU(HH= zw%$M2QTb_^UjA^O*-f7rq1Wg-6E(Vy_nSTaqn0^>w9+V1BA`^|+;?vNcMJH8QRCg# z0I_jaf2+6eIR>q> z3wzC;%D+;Bb3l1P*%9(0$~q$~t)p}x5!thn>_i&>0H*oIo`bXH<^TWy07*qoM6N<$ Eg5;A+jsO4v literal 0 HcmV?d00001 diff --git a/Resources/status_offline.png b/Resources/status_offline.png new file mode 100644 index 0000000000000000000000000000000000000000..243c5c069f0d359cb1d984bd6b2a03b53904beaf GIT binary patch literal 1179 zcmV;M1Z4Y(P)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RV1P>G!9N0hb3IG5EElET{R7l6Q zm0fHURTRhn=YDKkTDIM;R%(e&#h^qX0#&2D6%DZ(9!%UA*syGO>6TZG_@FTxZ z69dyOrEOXhs)(jZQ66ecYJ5-=8YK|*!6uYag_+r{rR>h^Jw9|xKWtHXpPTzT z_ssbK{wM40?F}{ zs2Z&`l$Ia@{DKe9_uzXzdKUn`>T z$^$%^gNM8+*5*BLbFo-_qUiap0GgLm81&6@?dD~>GTj3J_5qlN5N|YWsIyvITl4?) z^DXPdLqhQpFk%2iNxs3v(e^~*)DlqV@#7IsDT?Ehs7LOk~bnu7UO>N7v?h-#|z9he+--Mx1SLKX`sl>)i(7w@9LawzjrE0HCw8dk+yBtE;PeB9TY|0D{5F z{%mgMZGh_mY^bkq+$@L?1^{71#gcR+^&tcA3Smw!h~^70y;n4Nr{qi%2@Hc^xzp2a z^V=ekNP)ov^J^)Kn*hJFl&fX|Y0nlXu_2_{E2Yyd0Z3h5-ZwNfwC>JF zMWzwJOLKwZW9f9-2mlBu`4$MjYbm!^R8@R>@#5(E+l34c4oW6r0Vo4#QcC&&^Svn+ zi(Qji?bTZ60$T6!idE+(CdPN&MrWvZb2FcVu?IjAjAT3>cb7C(02m$~-X029pALm; z8bh_!Mk#&Dw(U&Tp82Y|x!GF{aP(+jol;&3L`MKr0mu`mEt!me^tbLkZ)0O)m6gGY zH)}(|mkXY+9NUHCWOI(~o^$N%h1q=GVTLPU>I`r0fe)}=2#+;7$zcKbspWyMn*;+yym*wvbMX0 t2|)nsVJHh>E(>4`!1swnV)|BR`~|8|uDc}G)KLHc002ovPDHLkV1ioW3y1&! literal 0 HcmV?d00001 diff --git a/Resources/status_orange.png b/Resources/status_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e66d34d04c7152d884a82fa5ad5e8cc1be6f57 GIT binary patch literal 1252 zcmVP000*V1^@s6{^R5m00001b5ch_0Itp) z=>Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RV1P>Gz4@H`Ql>h()c1c7*R7l6Q zm2GTORT#&A=d``uTDtKzR%jP9#@lwsJBk`VAjYU6ktmWFqXZHY_<%-YA|h^H=G34@ zB1`Zk!4cnx2$*PsMiN7SL=r(!*0pnEW~19$wh654rMK-leppAk0ZxpbFZZ6e=Xam~ z|GDSD|J0hS8B<5zo&ROv3tNKui3xhG7GhIcu^*@#7ZTa~u+KZa@*ZbVd0C#nyvR8* zFnK7}*qe$s#geh6UwV5_{=97CnN-*c%u$++eVX+kCIhySO0T|YCK^PjI{2uw(7(kn z3YH6}*XeM35r!9K_k%rvw)??O;2SXd8>@rom0~_1a)KP0{YI?&hLFh1x0N=^%zgpO zrOS&nCLrBjq~S#x9x{WMQT6~T*^jdOQOSOBLm*tBX`>;BIXXJOcQ~ATlcLJT;055Z)G;qFkaO zyWyPhOxj%W;<@AF8Liji2%EtNv=Xm^UXn8t78&(W#cN${*C3(l;6Y#wa0prWglUCr zfUp&qlTq9S!Y^PzNEOC*g(_Ze>l*80V^v@yLhJ@yBOs)GhiP?R6^&NlPOZd`KnPj5 z#I!B$*SBY3}{j~7aIMF)pfDcJz}qmd+~mbXhZOM#4A<{cfT z>vdxQ#|LA@Gt8Q3S%r-HlyX!6JAf|0iDq-3j}zy&&MX8lYcA9a&G#doE2-8?(9?m= z*;Y$mc4G3_f?W3DnG}GqQ1ffs!e&j>Do9X<=DX~gr9*D}tB_?H0NSB<<`}j@f|v>v z0GO`2Ou?RXj9f_jgapNfQIVe8b_Y*pix||-TsQ_gR5$H z{o6YwWCdrTI0Z}rJ~3;e>m)#BP4tj7CTtUiS73PFx%k`R!-=luqFV)=vw|y79LoY) zkUYnzI{;|=V$-uOfB9QR@jS!um;b2-E`2c69sb zVdLrCd}O!Vaq0BJR99p{I?+{%);@%Afxaj-?Mmy@W~8G*d`aeJG5!MDxX9kPx#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RV1P>G$2wY|f`2YX}L`g(JR7l6Q zm2GU3RTRg6_de~qJ#Dus?~b%(5+DIFyaZvvb^D-+5C|fuiI}KB&@aZoV$_gGG$iVL zOEg47(BQ%cW5gE(C5W_hiU??@PCK2lZe=hA0k)?d^yN8zSYf4XL!zEf_uPBW`Q86L zC-=htWCy^pkIJ%3zT>|KR7})3*MO{caB%@}{vUyUSiaitnK8A>oIP#4IdjScCED5l z({HD&A6wfmv_uch{P3N>1ayeNoeEi}UxsrQ=Pqg_aAg+tUcPq~s1g4?0&l4j*J$l^qrGm7 zQa6UjjW&zP_9e*nCa|ppww1*0OH3Hzti4XM9}No%;d@fx1wa{IGi7)@`y5^~?C`pq zRJkjbx^ULYSc$SsvTtJcd~#m4FIgk0^j(0f0CaQ#@e5bz8&nclCP?lSvfVYga^w8A zQ2g4(50qD0oVh;ITy~C@)K#~qDD0+^r1!qj}|DHmL+>wqjoFQSOvBMsitE+uxGF|x?Vu* z5ET``1mNI&+IsVoEu^ExK-Yl81=$k9w{`$Bak57C16~EogS5Y&S9DQ09|HPwQ&YYs zaJyFMTzg9EP3MmeJ$hh}eHp+gH8&ou zT{&k^iT`;))&k$8Fc!_FD+w^2mXwWJF7TPaZ3=m}P??Q-Iyd|!NM}>t_4s!j3{*+; z-H)95qJCf58w!M zoFV+rDCCXY)Rr1Lc3lCQOIOl8s{9V+HFxP!w@Z14<{OfT5tFo7m%5z25m2-|@l9l37z