From ec884c9264a80af7df837f1cb8689b250606dbcd Mon Sep 17 00:00:00 2001 From: Gautier Pelloux-Prayer Date: Thu, 5 Nov 2015 11:42:40 +0100 Subject: [PATCH] Assistant: fix various crashes and use cases --- Classes/AssistantView.m | 195 ++++++++++-------- Classes/Base.lproj/AssistantViewScreens.xib | 118 +++++++++-- Classes/LinphoneCoreSettingsStore.m | 18 +- Classes/LinphoneManager.m | 2 +- .../LinphoneUI/Base.lproj/UICompositeView.xib | 10 +- Classes/LinphoneUI/UIAssistantTextField.h | 2 +- Classes/LinphoneUI/UIAssistantTextField.m | 37 +--- TestsUI/AssistantTester.m | 5 +- prepare.py | 2 +- submodules/linphone | 2 +- 10 files changed, 238 insertions(+), 153 deletions(-) diff --git a/Classes/AssistantView.m b/Classes/AssistantView.m index c07309e91..4589ad1f0 100644 --- a/Classes/AssistantView.m +++ b/Classes/AssistantView.m @@ -118,6 +118,24 @@ static UICompositeViewDescription *compositeDescription = nil; #pragma mark - Utils +- (void)resetLiblinphone { + if (account_creator) { + linphone_account_creator_unref(account_creator); + account_creator = NULL; + } + [[LinphoneManager instance] resetLinphoneCore]; + account_creator = linphone_account_creator_new( + [LinphoneManager getLc], + [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" forSection:@"assistant" withDefault:@""] + .UTF8String); + linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self)); + linphone_account_creator_cbs_set_existence_tested(linphone_account_creator_get_callbacks(account_creator), + assistant_existence_tested); + linphone_account_creator_cbs_set_create_account(linphone_account_creator_get_callbacks(account_creator), + assistant_create_account); + linphone_account_creator_cbs_set_validation_tested(linphone_account_creator_get_callbacks(account_creator), + assistant_validation_tested); +} - (void)loadAssistantConfig:(NSString *)rcFilename { NSString *fullPath = [@"file://" stringByAppendingString:[LinphoneManager bundleFile:rcFilename]]; linphone_core_set_provisioning_uri([LinphoneManager getLc], fullPath.UTF8String); @@ -127,23 +145,7 @@ static UICompositeViewDescription *compositeDescription = nil; // to avoid it, we disable it before and reenable it after core restart. BOOL hasPreview = linphone_core_video_preview_enabled([LinphoneManager getLc]); linphone_core_enable_video_preview([LinphoneManager getLc], FALSE); - - if (account_creator) { - linphone_account_creator_unref(account_creator); - account_creator = NULL; - } - [[LinphoneManager instance] resetLinphoneCore]; - account_creator = linphone_account_creator_new( - [LinphoneManager getLc], - [LinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" forSection:@"assistant" withDefault:@""] - .UTF8String); - linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self)); - linphone_account_creator_cbs_set_existence_tested(linphone_account_creator_get_callbacks(account_creator), - assistant_existence_tested); - linphone_account_creator_cbs_set_create_account(linphone_account_creator_get_callbacks(account_creator), - assistant_create_account); - linphone_account_creator_cbs_set_validation_tested(linphone_account_creator_get_callbacks(account_creator), - assistant_validation_tested); + [self resetLiblinphone]; linphone_core_enable_video_preview([LinphoneManager getLc], hasPreview); // we will set the new default proxy config in the assistant linphone_core_set_default_proxy_config([LinphoneManager getLc], NULL); @@ -176,35 +178,43 @@ static UICompositeViewDescription *compositeDescription = nil; - (NSString *)errorForStatus:(LinphoneAccountCreatorStatus)status { BOOL usePhoneNumber = [[LinphoneManager instance] lpConfigBoolForKey:@"use_phone_number" forSection:@"assistant"]; - NSMutableString *err = [[NSMutableString alloc] init]; - if ((status & LinphoneAccountCreatorEmailInvalid) != 0) { - [err appendString:NSLocalizedString(@"Invalid email.", nil)]; + switch (status) { + case LinphoneAccountCreatorEmailInvalid: + return NSLocalizedString(@"Invalid email.", nil); + case LinphoneAccountCreatorUsernameInvalid: + return usePhoneNumber + ? NSLocalizedString(@"Invalid phone number.", nil) + : NSLocalizedString(@"Invalid username.", nil); + case LinphoneAccountCreatorUsernameTooShort: + return usePhoneNumber + ? NSLocalizedString(@"Phone number too short.", nil) + : NSLocalizedString(@"Username too short.", nil); + case LinphoneAccountCreatorUsernameInvalidSize: + return usePhoneNumber + ? NSLocalizedString(@"Phone number length invalid.", nil) + : NSLocalizedString(@"Username length invalid.", nil); + case LinphoneAccountCreatorPasswordTooShort: + return NSLocalizedString(@"Password too short.", nil); + case LinphoneAccountCreatorDomainInvalid: + return NSLocalizedString(@"Invalid domain.", nil); + case LinphoneAccountCreatorRouteInvalid: + return NSLocalizedString(@"Invalid route.", nil); + case LinphoneAccountCreatorDisplayNameInvalid: + return NSLocalizedString(@"Invalid display name.", nil); + case LinphoneAccountCreatorReqFailed: + return NSLocalizedString(@"Failed to query the server. Please try again later", nil); + case LinphoneAccountCreatorTransportNotSupported: + return NSLocalizedString(@"Unsupported transport", nil); + case LinphoneAccountCreatorAccountCreated: + case LinphoneAccountCreatorAccountExist: + case LinphoneAccountCreatorAccountNotCreated: + case LinphoneAccountCreatorAccountNotExist: + case LinphoneAccountCreatorAccountNotValidated: + case LinphoneAccountCreatorAccountValidated: + case LinphoneAccountCreatorOK: + break; } - if ((status & LinphoneAccountCreatorUsernameInvalid) != 0) { - [err appendString:usePhoneNumber ? NSLocalizedString(@"Invalid phone number.", nil) - : NSLocalizedString(@"Invalid username.", nil)]; - } - if ((status & LinphoneAccountCreatorUsernameTooShort) != 0) { - [err appendString:usePhoneNumber ? NSLocalizedString(@"Phone number too short.", nil) - : NSLocalizedString(@"Username too short.", nil)]; - } - if ((status & LinphoneAccountCreatorUsernameInvalidSize) != 0) { - [err appendString:usePhoneNumber ? NSLocalizedString(@"Phone number length invalid.", nil) - : NSLocalizedString(@"Username length invalid.", nil)]; - } - if ((status & LinphoneAccountCreatorPasswordTooShort) != 0) { - [err appendString:NSLocalizedString(@"Password too short.", nil)]; - } - if ((status & LinphoneAccountCreatorDomainInvalid) != 0) { - [err appendString:NSLocalizedString(@"Invalid domain.", nil)]; - } - if ((status & LinphoneAccountCreatorRouteInvalid) != 0) { - [err appendString:NSLocalizedString(@"Invalid route.", nil)]; - } - if ((status & LinphoneAccountCreatorDisplayNameInvalid) != 0) { - [err appendString:NSLocalizedString(@"Invalid display name.", nil)]; - } - return err; + return nil; } - (BOOL)addProxyConfig:(LinphoneProxyConfig *)proxy { @@ -405,43 +415,57 @@ static UICompositeViewDescription *compositeDescription = nil; UIAssistantTextField *createUsername = [self findTextField:ViewElement_Username]; [createUsername showError:[self errorForStatus:LinphoneAccountCreatorUsernameInvalid] when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorStatus s = - linphone_account_creator_set_username(account_creator, inputEntry.UTF8String); - createUsername.errorLabel.text = [self errorForStatus:s]; - return s != LinphoneAccountCreatorOk; + LinphoneAccountCreatorStatus s = + linphone_account_creator_set_username(account_creator, inputEntry.UTF8String); + createUsername.errorLabel.text = [self errorForStatus:s]; + return s != LinphoneAccountCreatorOK; }]; UIAssistantTextField *password = [self findTextField:ViewElement_Password]; [password showError:[self errorForStatus:LinphoneAccountCreatorPasswordTooShort] when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorStatus s = - linphone_account_creator_set_password(account_creator, inputEntry.UTF8String); - password.errorLabel.text = [self errorForStatus:s]; - return s != LinphoneAccountCreatorOk; + LinphoneAccountCreatorStatus s = + linphone_account_creator_set_password(account_creator, inputEntry.UTF8String); + password.errorLabel.text = [self errorForStatus:s]; + return s != LinphoneAccountCreatorOK; }]; UIAssistantTextField *password2 = [self findTextField:ViewElement_Password2]; [password2 showError:NSLocalizedString(@"Passwords do not match.", nil) when:^BOOL(NSString *inputEntry) { - return ![inputEntry isEqualToString:[self findTextField:ViewElement_Password].text]; + return ![inputEntry isEqualToString:[self findTextField:ViewElement_Password].text]; }]; UIAssistantTextField *email = [self findTextField:ViewElement_Email]; [email showError:[self errorForStatus:LinphoneAccountCreatorEmailInvalid] when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorStatus s = - linphone_account_creator_set_email(account_creator, inputEntry.UTF8String); - email.errorLabel.text = [self errorForStatus:s]; - return s != LinphoneAccountCreatorOk; + LinphoneAccountCreatorStatus s = + linphone_account_creator_set_email(account_creator, inputEntry.UTF8String); + email.errorLabel.text = [self errorForStatus:s]; + return s != LinphoneAccountCreatorOK; }]; UIAssistantTextField *domain = [self findTextField:ViewElement_Domain]; [domain showError:[self errorForStatus:LinphoneAccountCreatorDomainInvalid] when:^BOOL(NSString *inputEntry) { - LinphoneAccountCreatorStatus s = - linphone_account_creator_set_domain(account_creator, inputEntry.UTF8String); - domain.errorLabel.text = [self errorForStatus:s]; - return s != LinphoneAccountCreatorOk; + LinphoneAccountCreatorStatus s = + linphone_account_creator_set_domain(account_creator, inputEntry.UTF8String); + domain.errorLabel.text = [self errorForStatus:s]; + return s != LinphoneAccountCreatorOK; + }]; + + UIAssistantTextField *url = [self findTextField:ViewElement_URL]; + [url showError:NSLocalizedString(@"Invalid remote provisionning URL", nil) + when:^BOOL(NSString *inputEntry) { + NSString *url = [self findTextField:ViewElement_URL].text; + if (url.length > 0) { + // missing prefix will result in http:// being used + if ([url rangeOfString:@"://"].location == NSNotFound) { + url = [NSString stringWithFormat:@"http://%@", url]; + } + return (linphone_core_set_provisioning_uri([LinphoneManager getLc], [url UTF8String]) != 0); + } + return TRUE; }]; [self shouldEnableNextButton]; @@ -534,27 +558,26 @@ static UICompositeViewDescription *compositeDescription = nil; void assistant_existence_tested(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status) { AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorFailed) { + if (status == LinphoneAccountCreatorAccountExist) { [[thiz findTextField:ViewElement_Username] showError:NSLocalizedString(@"This name is already taken.", nil)]; [thiz findButton:ViewElement_NextButton].enabled = NO; - } else { - [thiz changeView:thiz.createAccountActivationView back:FALSE animation:TRUE]; + } else if (status == LinphoneAccountCreatorAccountNotExist) { + linphone_account_creator_create_account(thiz->account_creator); } } void assistant_create_account(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status) { AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorOk) { - thiz.waitView.hidden = NO; - linphone_account_creator_test_validation(thiz->account_creator); + if (status == LinphoneAccountCreatorAccountCreated) { + [thiz changeView:thiz.createAccountActivationView back:FALSE animation:TRUE]; } else { UIAlertView *errorView = [[UIAlertView alloc] - initWithTitle:NSLocalizedString(@"Account validation issue", nil) - message:NSLocalizedString(@"Your account could not be created, please try again later.", nil) - delegate:nil - cancelButtonTitle:NSLocalizedString(@"Continue", nil) - otherButtonTitles:nil, nil]; + initWithTitle:NSLocalizedString(@"Account creation issue", nil) + message:NSLocalizedString(@"Your account could not be created, please try again later.", nil) + delegate:nil + cancelButtonTitle:NSLocalizedString(@"Continue", nil) + otherButtonTitles:nil, nil]; [errorView show]; } } @@ -562,11 +585,11 @@ void assistant_create_account(LinphoneAccountCreator *creator, LinphoneAccountCr void assistant_validation_tested(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status) { AssistantView *thiz = (__bridge AssistantView *)(linphone_account_creator_get_user_data(creator)); thiz.waitView.hidden = YES; - if (status == LinphoneAccountCreatorOk) { + if (status == LinphoneAccountCreatorAccountValidated) { [thiz addProxyConfig:linphone_account_creator_configure(creator)]; - } else { + } else if (status == LinphoneAccountCreatorAccountNotValidated) { DTAlertView *alert = [[DTAlertView alloc] - initWithTitle:NSLocalizedString(@"Account validation failed.", nil) + initWithTitle:NSLocalizedString(@"Account validation failed", nil) message: NSLocalizedString( @"Your account could not be checked yet. You can skip this validation or try again later.", @@ -638,12 +661,12 @@ void assistant_validation_tested(LinphoneAccountCreator *creator, LinphoneAccoun - (IBAction)onCreateAccountActivationClick:(id)sender { _waitView.hidden = NO; - linphone_account_creator_create_account(account_creator); + linphone_account_creator_test_validation(account_creator); } - (IBAction)onLinphoneLoginClick:(id)sender { _waitView.hidden = NO; - linphone_account_creator_test_validation(account_creator); + [self addProxyConfig:linphone_account_creator_configure(account_creator)]; } - (IBAction)onLoginClick:(id)sender { @@ -653,23 +676,13 @@ void assistant_validation_tested(LinphoneAccountCreator *creator, LinphoneAccoun - (IBAction)onRemoteProvisionningLoginClick:(id)sender { _waitView.hidden = NO; + [[LinphoneManager instance] lpConfigSetInt:1 forKey:@"transient_provisioning" forSection:@"misc"]; [self addProxyConfig:linphone_account_creator_configure(account_creator)]; } - (IBAction)onRemoteProvisionningDownloadClick:(id)sender { - NSString *url = [self findTextField:ViewElement_URL].text; - if ([url length] > 0) { - // missing prefix will result in http:// being used - if ([url rangeOfString:@"://"].location == NSNotFound) { - url = [NSString stringWithFormat:@"http://%@", url]; - } - - LOGI(@"Should use remote provisioning URL %@", url); - linphone_core_set_provisioning_uri([LinphoneManager getLc], [url UTF8String]); - - [_waitView setHidden:false]; - [[LinphoneManager instance] resetLinphoneCore]; - } + [_waitView setHidden:false]; + [self resetLiblinphone]; } - (IBAction)onTransportChange:(id)sender { diff --git a/Classes/Base.lproj/AssistantViewScreens.xib b/Classes/Base.lproj/AssistantViewScreens.xib index 6d142da95..c001b3e4b 100644 --- a/Classes/Base.lproj/AssistantViewScreens.xib +++ b/Classes/Base.lproj/AssistantViewScreens.xib @@ -164,10 +164,19 @@ + + - + @@ -185,10 +194,19 @@ + + - + @@ -206,10 +224,19 @@ + + - + @@ -227,8 +254,17 @@ + +