FirstLogin: add view

This commit is contained in:
Gautier Pelloux-Prayer 2015-11-06 11:09:32 +01:00
parent 7ae3fa6d2e
commit f587715ca4
4 changed files with 318 additions and 0 deletions

36
Classes/FirstLoginView.h Normal file
View file

@ -0,0 +1,36 @@
/* FirstLoginViewController.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 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 <UIKit/UIKit.h>
#import "UICompositeView.h"
@interface FirstLoginView : UIViewController <UITextFieldDelegate, UICompositeViewDelegate> {
}
- (IBAction)onLoginClick:(id)sender;
- (IBAction)onSiteClick:(id)sender;
@property(nonatomic, strong) IBOutlet UIButton *loginButton;
@property(nonatomic, strong) IBOutlet UIButton *siteButton;
@property(nonatomic, strong) IBOutlet UITextField *usernameField;
@property(nonatomic, strong) IBOutlet UITextField *passwordField;
@property(nonatomic, strong) IBOutlet UIView *waitView;
@end

178
Classes/FirstLoginView.m Normal file
View file

@ -0,0 +1,178 @@
/* FirstLoginViewController.m
*
* 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 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 "LinphoneManager.h"
#import "FirstLoginView.h"
#import "LinphoneManager.h"
#import "PhoneMainView.h"
@implementation FirstLoginView
#pragma mark - UICompositeViewDelegate Functions
static UICompositeViewDescription *compositeDescription = nil;
+ (UICompositeViewDescription *)compositeViewDescription {
if (compositeDescription == nil) {
compositeDescription = [[UICompositeViewDescription alloc] init:self.class
statusBar:nil
tabBar:nil
sideMenu:nil
fullscreen:false
landscapeMode:LinphoneManager.runningOnIpad
portraitMode:true];
}
return compositeDescription;
}
- (UICompositeViewDescription *)compositeViewDescription {
return self.class.compositeViewDescription;
}
#pragma mark - ViewController Functions
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// Set observer
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(registrationUpdateEvent:)
name:kLinphoneRegistrationUpdate
object:nil];
[_usernameField setText:[[LinphoneManager instance] lpConfigStringForKey:@"assistant_username"]];
[_passwordField setText:[[LinphoneManager instance] lpConfigStringForKey:@"assistant_password"]];
// Update on show
const MSList *list = linphone_core_get_proxy_config_list([LinphoneManager getLc]);
if (list != NULL) {
LinphoneProxyConfig *config = (LinphoneProxyConfig *)list->data;
if (config) {
[self registrationUpdate:linphone_proxy_config_get_state(config)];
}
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// Remove observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:kLinphoneRegistrationUpdate object:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString *siteUrl = [[LinphoneManager instance] lpConfigStringForKey:@"first_login_view_url"];
if (siteUrl == nil) {
siteUrl = @"http://www.linphone.org";
}
[_siteButton setTitle:siteUrl forState:UIControlStateNormal];
}
#pragma mark - Event Functions
- (void)registrationUpdateEvent:(NSNotification *)notif {
[self registrationUpdate:[[notif.userInfo objectForKey:@"state"] intValue]];
}
#pragma mark -
- (void)registrationUpdate:(LinphoneRegistrationState)state {
switch (state) {
case LinphoneRegistrationOk: {
[[LinphoneManager instance] lpConfigSetBool:FALSE forKey:@"enable_first_login_view_preference"];
[_waitView setHidden:true];
[PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription];
break;
}
case LinphoneRegistrationNone:
case LinphoneRegistrationCleared: {
[_waitView setHidden:true];
break;
}
case LinphoneRegistrationFailed: {
[_waitView setHidden:true];
// erase uername passwd
[[LinphoneManager instance] lpConfigSetString:nil forKey:@"assistant_username"];
[[LinphoneManager instance] lpConfigSetString:nil forKey:@"assistant_password"];
break;
}
case LinphoneRegistrationProgress: {
[_waitView setHidden:false];
break;
}
default:
break;
}
}
#pragma mark - Action Functions
- (void)onSiteClick:(id)sender {
NSURL *url = [NSURL URLWithString:_siteButton.titleLabel.text];
[[UIApplication sharedApplication] openURL:url];
return;
}
- (void)onLoginClick:(id)sender {
NSString *errorMessage = nil;
if ([_usernameField.text length] == 0) {
errorMessage = NSLocalizedString(@"Enter your username", nil);
} else if ([_passwordField.text length] == 0) {
errorMessage = NSLocalizedString(@"Enter your password", nil);
}
if (errorMessage != nil) {
UIAlertView *error = nil;
error = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert", nil)
message:errorMessage
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Continue", nil)
otherButtonTitles:nil];
[error show];
} else {
linphone_core_clear_all_auth_info([LinphoneManager getLc]);
linphone_core_clear_proxy_config([LinphoneManager getLc]);
LinphoneProxyConfig *proxyCfg = linphone_core_create_proxy_config([LinphoneManager getLc]);
/*default domain is supposed to be preset from linphonerc*/
NSString *identity =
[NSString stringWithFormat:@"sip:%@@%s", _usernameField.text, linphone_proxy_config_get_addr(proxyCfg)];
linphone_proxy_config_set_identity(proxyCfg, [identity UTF8String]);
LinphoneAuthInfo *auth_info = linphone_auth_info_new(
[_usernameField.text UTF8String], [_usernameField.text UTF8String], [_passwordField.text UTF8String], NULL,
NULL, linphone_proxy_config_get_domain(proxyCfg));
linphone_core_add_auth_info([LinphoneManager getLc], auth_info);
linphone_core_add_proxy_config([LinphoneManager getLc], proxyCfg);
linphone_core_set_default_proxy_config([LinphoneManager getLc], proxyCfg);
// reload address book to prepend proxy config domain to contacts' phone number
[[[LinphoneManager instance] fastAddressBook] reload];
[_waitView setHidden:false];
};
}
#pragma mark - UITextFieldDelegate Functions
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
// When the user presses return, take focus away from the text field so that the keyboard is dismissed.
[theTextField resignFirstResponder];
return YES;
}
@end

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="4514" systemVersion="13B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<deployment defaultVersion="1072" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3747"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="FirstLoginViewController">
<connections>
<outlet property="loginButton" destination="64" id="65"/>
<outlet property="passwordField" destination="8" id="60"/>
<outlet property="siteButton" destination="35" id="58"/>
<outlet property="usernameField" destination="6" id="59"/>
<outlet property="view" destination="55" id="56"/>
<outlet property="waitView" destination="31" id="57"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="55">
<rect key="frame" x="0.0" y="0.0" width="320" height="460"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="64" userLabel="loginButton">
<rect key="frame" x="33" y="312" width="255" height="50"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Login"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="20"/>
<state key="normal" title="Login" backgroundImage="button_background_default.png">
<color key="titleColor" red="0.35686274509999999" green="0.39607843139999999" blue="0.43529411759999997" alpha="1" colorSpace="deviceRGB"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted" backgroundImage="button_background_over.png">
<color key="titleColor" red="0.72549019609999998" green="0.76862745099999996" blue="0.79607843140000001" alpha="1" colorSpace="deviceRGB"/>
</state>
<connections>
<action selector="onLoginClick:" destination="-1" eventType="touchUpInside" id="66"/>
</connections>
</button>
<button hidden="YES" opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="35" userLabel="siteButton">
<rect key="frame" x="60" y="420" width="200" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" name="Helvetica-Bold" family="Helvetica" pointSize="15"/>
<state key="normal">
<color key="titleColor" red="0.19607843" green="0.30980393000000001" blue="0.52156866000000002" alpha="1" colorSpace="calibratedRGB"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="onSiteClick:" destination="-1" eventType="touchUpInside" id="63"/>
</connections>
</button>
<textField opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="Username" minimumFontSize="17" background="field_background.png" id="6" userLabel="usernameField">
<rect key="frame" x="60" y="170" width="200" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Username"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocorrectionType="no"/>
<connections>
<outlet property="delegate" destination="-1" id="39"/>
</connections>
</textField>
<textField opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" placeholder="Password" clearsOnBeginEditing="YES" minimumFontSize="17" background="field_background.png" id="8" userLabel="passwordField">
<rect key="frame" x="60" y="220" width="200" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Password"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="-1" id="17"/>
</connections>
</textField>
<view hidden="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="31" userLabel="waitView">
<rect key="frame" x="0.0" y="0.0" width="320" height="460"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<activityIndicatorView opaque="NO" clearsContextBeforeDrawing="NO" userInteractionEnabled="NO" contentMode="scaleToFill" animating="YES" style="whiteLarge" id="32" userLabel="activityIndicator">
<rect key="frame" x="142" y="211" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</activityIndicatorView>
</subviews>
<color key="backgroundColor" white="1" alpha="0.66000000000000003" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
</objects>
<resources>
<image name="button_background_default.png" width="550" height="101"/>
<image name="button_background_over.png" width="550" height="101"/>
<image name="field_background.png" width="542" height="88"/>
</resources>
</document>

View file

@ -79,6 +79,8 @@
63058AE01B4E937300EFAE36 /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 63058ACE1B4E922500EFAE36 /* sounds */; };
63058AE21B4E93A100EFAE36 /* tester_hosts in Resources */ = {isa = PBXBuildFile; fileRef = 63058AE11B4E93A100EFAE36 /* tester_hosts */; };
63058AE31B4E93B300EFAE36 /* tester_hosts in Resources */ = {isa = PBXBuildFile; fileRef = 63058AE11B4E93A100EFAE36 /* tester_hosts */; };
6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6306440C1BECB08500134C72 /* FirstLoginView.m */; };
6306440F1BECB08500134C72 /* FirstLoginView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6306440D1BECB08500134C72 /* FirstLoginView.xib */; };
630CF5571AF7CE1500539F7A /* UITextField+DoneButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */; };
631348301B6F7B6600C6BDCB /* UIRoundBorderedButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6313482F1B6F7B6600C6BDCB /* UIRoundBorderedButton.m */; };
631348321B6FA53300C6BDCB /* rootca.pem in Resources */ = {isa = PBXBuildFile; fileRef = 631348311B6FA53300C6BDCB /* rootca.pem */; };
@ -885,6 +887,9 @@
63058ACE1B4E922500EFAE36 /* sounds */ = {isa = PBXFileReference; lastKnownFileType = folder; name = sounds; path = ../submodules/linphone/tester/sounds; sourceTree = "<group>"; };
63058AE11B4E93A100EFAE36 /* tester_hosts */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tester_hosts; path = submodules/linphone/tester/tester_hosts; sourceTree = SOURCE_ROOT; };
63058AE41B4E952E00EFAE36 /* share */ = {isa = PBXFileReference; lastKnownFileType = folder; name = share; path = "../liblinphone-sdk/apple-darwin/share"; sourceTree = "<group>"; };
6306440B1BECB08500134C72 /* FirstLoginView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FirstLoginView.h; sourceTree = "<group>"; };
6306440C1BECB08500134C72 /* FirstLoginView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FirstLoginView.m; sourceTree = "<group>"; };
6306440D1BECB08500134C72 /* FirstLoginView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FirstLoginView.xib; sourceTree = "<group>"; };
630CF5551AF7CE1500539F7A /* UITextField+DoneButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+DoneButton.h"; sourceTree = "<group>"; };
630CF5561AF7CE1500539F7A /* UITextField+DoneButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+DoneButton.m"; sourceTree = "<group>"; };
6313482E1B6F7B6600C6BDCB /* UIRoundBorderedButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIRoundBorderedButton.h; sourceTree = "<group>"; };
@ -1775,6 +1780,9 @@
22F2508B107141E100AC9B3F /* DialerView.h */,
22F2508C107141E100AC9B3F /* DialerView.m */,
D38187C415FE345B00C3EDCA /* DialerView.xib */,
6306440B1BECB08500134C72 /* FirstLoginView.h */,
6306440C1BECB08500134C72 /* FirstLoginView.m */,
6306440D1BECB08500134C72 /* FirstLoginView.xib */,
635775231B6673EC00C8B704 /* HistoryDetailsTableView.h */,
635775241B6673EC00C8B704 /* HistoryDetailsTableView.m */,
C90FAA7615AF54E6002091CB /* HistoryDetailsView.h */,
@ -2969,6 +2977,7 @@
639112BB1BE2532100E6C772 /* speaker_selected.png in Resources */,
6352A5761BE0D4B800594C1C /* CallSideMenuView.xib in Resources */,
639111DE1BE2532100E6C772 /* color_G.png in Resources */,
6306440F1BECB08500134C72 /* FirstLoginView.xib in Resources */,
6391115C1BE2532100E6C772 /* add_field_over.png in Resources */,
639111961BE2532100E6C772 /* call_start_body_over.png in Resources */,
639111631BE2532100E6C772 /* back_disabled@2x.png in Resources */,
@ -3452,6 +3461,7 @@
D3F7998115BD32370018C273 /* TPMultiLayoutViewController.m in Sources */,
D3807FBF15C28940005BE9BC /* DCRoundSwitch.m in Sources */,
D3807FC115C28940005BE9BC /* DCRoundSwitchKnobLayer.m in Sources */,
6306440E1BECB08500134C72 /* FirstLoginView.m in Sources */,
D3807FC315C28940005BE9BC /* DCRoundSwitchOutlineLayer.m in Sources */,
D3807FC515C28940005BE9BC /* DCRoundSwitchToggleLayer.m in Sources */,
D3807FE815C2894A005BE9BC /* IASKAppSettingsViewController.m in Sources */,