forked from mirrors/linphone-iphone
FirstLogin: add view
This commit is contained in:
parent
7ae3fa6d2e
commit
f587715ca4
4 changed files with 318 additions and 0 deletions
36
Classes/FirstLoginView.h
Normal file
36
Classes/FirstLoginView.h
Normal 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
178
Classes/FirstLoginView.m
Normal 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
|
||||
94
Classes/FirstLoginView.xib
Normal file
94
Classes/FirstLoginView.xib
Normal 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>
|
||||
|
|
@ -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 */,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue