Merge branch 'master' into dev_vcard

This commit is contained in:
Gautier Pelloux-Prayer 2016-01-27 15:03:50 +01:00
commit 292a0c85fe
135 changed files with 1221 additions and 1423 deletions

1
.gitignore vendored
View file

@ -15,3 +15,4 @@ git-clang-format.diff
submodules/tunnel
submodules/binaries/dummy-*.a
linphone-iphone.ipa
TutorialHellowWorld/hello-world.xcodeproj/project.xcworkspace/

45
.gitmodules vendored
View file

@ -1,57 +1,57 @@
[submodule "submodules/linphone"]
path = submodules/linphone
url = git://git.linphone.org/linphone
url = git://git.linphone.org/linphone.git
[submodule "submodules/externals/gsm"]
path = submodules/externals/gsm
url = git://git.linphone.org/gsm
url = git://git.linphone.org/gsm.git
[submodule "submodules/externals/speex"]
path = submodules/externals/speex
url = git://git.linphone.org/speex
url = git://git.linphone.org/speex.git
[submodule "submodules/externals/opencore-amr"]
path = submodules/externals/opencore-amr
url = git://git.linphone.org/opencore-amr.git
ignore = dirty
[submodule "submodules/msamr"]
path = submodules/msamr
url = git://git.linphone.org/msamr
url = git://git.linphone.org/msamr.git
[submodule "submodules/externals/ffmpeg"]
path = submodules/externals/ffmpeg
url = git://git.linphone.org/ffmpeg
url = git://git.linphone.org/ffmpeg.git
[submodule "submodules/externals/x264"]
path = submodules/externals/x264
url = git://git.linphone.org/x264
url = git://git.linphone.org/x264.git
ignore = dirty
[submodule "submodules/msx264"]
path = submodules/msx264
url = git://git.linphone.org/msx264
url = git://git.linphone.org/msx264.git
[submodule "submodules/externals/libvpx"]
path = submodules/externals/libvpx
url = git://git.linphone.org/libvpx
url = git://git.linphone.org/libvpx.git
ignore = dirty
[submodule "submodules/bzrtp"]
path = submodules/bzrtp
url = git://git.linphone.org/bzrtp
url = git://git.linphone.org/bzrtp.git
[submodule "submodules/mssilk"]
path = submodules/mssilk
url = git://git.linphone.org/mssilk
url = git://git.linphone.org/mssilk.git
[submodule "submodules/externals/srtp"]
path = submodules/externals/srtp
url = git://git.linphone.org/srtp
url = git://git.linphone.org/srtp.git
[submodule "submodules/bcg729"]
path = submodules/bcg729
url = git://git.linphone.org/bcg729
url = git://git.linphone.org/bcg729.git
[submodule "submodules/belle-sip"]
path = submodules/belle-sip
url = git://git.linphone.org/belle-sip
url = git://git.linphone.org/belle-sip.git
[submodule "submodules/externals/antlr3"]
path = submodules/externals/antlr3
url = git://git.linphone.org/antlr3
url = git://git.linphone.org/antlr3.git
[submodule "submodules/externals/polarssl"]
path = submodules/externals/polarssl
url = git://git.linphone.org/polarssl
url = git://git.linphone.org/polarssl.git
[submodule "submodules/externals/opus"]
path = submodules/externals/opus
url = git://git.linphone.org/opus
url = git://git.linphone.org/opus.git
ignore = dirty
[submodule "submodules/externals/libxml2"]
path = submodules/externals/libxml2
@ -59,7 +59,7 @@
ignore = dirty
[submodule "submodules/cunit"]
path = submodules/cunit
url = git://git.linphone.org/cunit
url = git://git.linphone.org/cunit.git
ignore = dirty
[submodule "submodules/externals/openh264"]
path = submodules/externals/openh264
@ -67,21 +67,24 @@
ignore = dirty
[submodule "submodules/msopenh264"]
path = submodules/msopenh264
url = git://git.linphone.org/msopenh264
url = git://git.linphone.org/msopenh264.git
[submodule "submodules/mswebrtc"]
path = submodules/mswebrtc
url = git://git.linphone.org/mswebrtc
url = git://git.linphone.org/mswebrtc.git
[submodule "Classes/KIF"]
path = Classes/KIF
url = https://github.com/kif-framework/KIF
ignore = dirty
[submodule "submodules/cmake-builder"]
path = submodules/cmake-builder
url = git://git.linphone.org/linphone-cmake-builder
url = git://git.linphone.org/linphone-cmake-builder.git
[submodule "submodules/externals/vo-amrwbenc"]
path = submodules/externals/vo-amrwbenc
url = git://git.linphone.org/vo-amrwbenc
url = git://git.linphone.org/vo-amrwbenc.git
ignore = dirty
[submodule "submodules/externals/libmatroska-c"]
path = submodules/externals/libmatroska-c
url = git://git.linphone.org/libmatroska-c.git
[submodule "submodules/belr"]
path = submodules/belr
url = git://git.linphone.org/belr

View file

@ -1,4 +1,5 @@
language: objective-c
osx_image: xcode7.2
env:
global:
@ -7,8 +8,7 @@ env:
before_install:
- brew update 1>/dev/null
- brew install doxygen nasm yasm optipng imagemagick coreutils intltool ninja antlr
- brew upgrade cmake
- brew install doxygen nasm yasm optipng imagemagick intltool ninja antlr cmake
- wget --no-check-certificate https://raw.githubusercontent.com/FFmpeg/gas-preprocessor/master/gas-preprocessor.pl
- chmod +x gas-preprocessor.pl
- sudo mv gas-preprocessor.pl /usr/local/bin

View file

@ -147,19 +147,6 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)reset {
[LinphoneManager.instance removeAllAccounts];
[LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"pushnotification_preference"];
LinphoneCore *lc = LC;
LCSipTransports transportValue = {5060, 5060, -1, -1};
if (linphone_core_set_sip_transports(lc, &transportValue)) {
LOGE(@"cannot set transport");
}
[LinphoneManager.instance lpConfigSetBool:FALSE forKey:@"ice_preference"];
[LinphoneManager.instance lpConfigSetString:@"" forKey:@"stun_preference"];
linphone_core_set_stun_server(lc, NULL);
linphone_core_set_firewall_policy(lc, LinphonePolicyNoFirewall);
[self resetTextFields];
[self changeView:_welcomeView back:FALSE animation:FALSE];
_waitView.hidden = TRUE;
@ -213,15 +200,28 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)configureProxyConfig {
LinphoneCore *lc = LC;
LinphoneManager *lm = LinphoneManager.instance;
if (!linphone_core_is_network_reachable(LC)) {
UIAlertView *error =
[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Network Error", nil)
message:NSLocalizedString(@"There is no network connection available, enable "
@"WIFI or WWAN prior to configure an account",
nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:nil];
[error show];
_waitView.hidden = YES;
return;
}
// remove previous proxy config, if any
if (new_config != NULL) {
const LinphoneAuthInfo *auth = linphone_proxy_config_find_auth_info(new_config);
linphone_core_remove_proxy_config(lc, new_config);
linphone_core_remove_proxy_config(LC, new_config);
if (auth) {
linphone_core_remove_auth_info(lc, auth);
linphone_core_remove_auth_info(LC, auth);
}
}
@ -229,7 +229,7 @@ static UICompositeViewDescription *compositeDescription = nil;
if (new_config) {
[lm configurePushTokenForProxyConfig:new_config];
linphone_core_set_default_proxy_config(lc, new_config);
linphone_core_set_default_proxy_config(LC, new_config);
// reload address book to prepend proxy config domain to contacts' phone number
// todo: STOP doing that!
[[LinphoneManager.instance fastAddressBook] reload];

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
@ -67,7 +67,7 @@
</button>
</subviews>
</view>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" showsHorizontalScrollIndicator="NO" id="98" userLabel="contentView" customClass="TPKeyboardAvoidingScrollView">
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" tag="7" contentMode="scaleToFill" bounces="NO" id="98" userLabel="contentView" customClass="TPKeyboardAvoidingScrollView">
<rect key="frame" x="0.0" y="66" width="375" height="559"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
@ -22,11 +22,11 @@
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="33" userLabel="welcomeView">
<rect key="frame" x="0.0" y="0.0" width="375" height="470"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="426"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="WELCOME" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="126" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -35,7 +35,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="This assistant will help you to use a SIP account for your calls." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="Yci-5h-O4o" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="58"/>
<rect key="frame" x="36" y="66" width="302" height="58"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -44,7 +44,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="wordWrap" id="36" userLabel="createAccountButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="40" y="187" width="299" height="40"/>
<rect key="frame" x="40" y="153" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Create account">
<bool key="isElement" value="YES"/>
@ -58,7 +58,7 @@
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="wordWrap" id="38" userLabel="linphoneLoginButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="40" y="261" width="299" height="40"/>
<rect key="frame" x="40" y="227" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Use Linphone account">
<bool key="isElement" value="YES"/>
@ -74,25 +74,8 @@
<action selector="onGotoLinphoneLoginClick:" destination="-1" eventType="touchUpInside" id="4AG-ng-fIB"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="wordWrap" id="Kbn-dL-C5h" userLabel="remoteProvisioningButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="40" y="410" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Fetch remote configuration">
<bool key="isElement" value="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<state key="normal" title="FETCH REMOTE CONFIGURATION">
<color key="titleColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="0.72549019609999998" green="0.76862745099999996" blue="0.79607843140000001" alpha="1" colorSpace="deviceRGB"/>
</state>
<connections>
<action selector="onGotoRemoteProvisioningClick:" destination="-1" eventType="touchUpInside" id="cAo-3u-yUT"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="wordWrap" id="39" userLabel="loginButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="39" y="335" width="299" height="40"/>
<rect key="frame" x="40" y="301" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Use SIP account">
<bool key="isElement" value="YES"/>
@ -108,18 +91,35 @@
<action selector="onGotoLoginClick:" destination="-1" eventType="touchUpInside" id="qRw-RY-0ip"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="wordWrap" id="Kbn-dL-C5h" userLabel="remoteProvisioningButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="40" y="376" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Fetch remote configuration">
<bool key="isElement" value="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<state key="normal" title="FETCH REMOTE CONFIGURATION">
<color key="titleColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<state key="highlighted">
<color key="titleColor" red="0.72549019609999998" green="0.76862745099999996" blue="0.79607843140000001" alpha="1" colorSpace="deviceRGB"/>
</state>
<connections>
<action selector="onGotoRemoteProvisioningClick:" destination="-1" eventType="touchUpInside" id="cAo-3u-yUT"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="203.5" y="211"/>
<point key="canvasLocation" x="203.5" y="189"/>
</view>
<view contentMode="scaleToFill" id="44" userLabel="createAccountView">
<rect key="frame" x="0.0" y="0.0" width="375" height="545"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="511"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="CREATE ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="4Aj-nv-TyO" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -128,7 +128,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="1/2" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="jFY-Po-QZN" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="29"/>
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -137,14 +137,14 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" tag="120" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="USERNAME" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ZSJ-Lv-n60" userLabel="usernameLabel">
<rect key="frame" x="38" y="165" width="299" height="14"/>
<rect key="frame" x="38" y="131" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="100" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="74" userLabel="usernameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="187" width="299" height="30"/>
<rect key="frame" x="38" y="153" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Username"/>
@ -157,21 +157,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid username" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="nOO-ch-4RW" userLabel="usernameErrorLabel">
<rect key="frame" x="38" y="217" width="299" height="10"/>
<rect key="frame" x="38" y="183" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PASSWORD" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="RIQ-aB-k0Y" userLabel="passwordLabel">
<rect key="frame" x="38" y="236" width="299" height="14"/>
<rect key="frame" x="38" y="202" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="101" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="75" userLabel="passwordField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="261" width="299" height="30"/>
<rect key="frame" x="38" y="227" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Password "/>
@ -184,21 +184,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid password" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="qbL-gD-kHo" userLabel="passwordErrorLabel">
<rect key="frame" x="38" y="291" width="299" height="10"/>
<rect key="frame" x="38" y="257" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PASSWORD CONFIRMATION" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="yyK-OU-HXT" userLabel="password2Label">
<rect key="frame" x="38" y="313" width="299" height="14"/>
<rect key="frame" x="38" y="279" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="102" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="76" userLabel="password2Field" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="335" width="299" height="30"/>
<rect key="frame" x="38" y="301" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Password confirmation"/>
@ -211,21 +211,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Passwords do not match" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="xZk-J2-sOC" userLabel="password2ErrorLabel">
<rect key="frame" x="38" y="365" width="299" height="10"/>
<rect key="frame" x="38" y="331" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="EMAIL" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Syg-X5-YFX" userLabel="emailLabel">
<rect key="frame" x="38" y="388" width="299" height="14"/>
<rect key="frame" x="38" y="354" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="103" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="79" userLabel="emailField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="410" width="299" height="30"/>
<rect key="frame" x="38" y="376" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Email"/>
@ -238,14 +238,14 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid email" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="boL-zt-q9f" userLabel="emailErrorLabel">
<rect key="frame" x="38" y="440" width="299" height="10"/>
<rect key="frame" x="38" y="406" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="K99-0e-fHC" userLabel="createAccountButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="485" width="299" height="40"/>
<rect key="frame" x="38" y="451" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Create account">
<bool key="isElement" value="YES"/>
@ -265,14 +265,14 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="625.5" y="248.5"/>
<point key="canvasLocation" x="625.5" y="231.5"/>
</view>
<view contentMode="scaleToFill" id="101" userLabel="createAccountActivationView">
<rect key="frame" x="0.0" y="0.0" width="375" height="400"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="366"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="CREATE ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="Gyl-37-emh" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -281,7 +281,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="2/2" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="mao-1f-HLz" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="29"/>
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -290,7 +290,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="ACTIVATE YOUR ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="9AN-gT-I7D" userLabel="activateLabel">
<rect key="frame" x="36" y="165" width="302" height="59"/>
<rect key="frame" x="36" y="131" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
@ -298,17 +298,19 @@
<nil key="highlightedColor"/>
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Your account is created. Please check your mails in order to validate your account." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="UWU-j2-pUb" userLabel="activateDescLabel">
<rect key="frame" x="36" y="252" width="302" height="59"/>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="8" baselineAdjustment="alignBaselines" minimumFontSize="10" id="UWU-j2-pUb" userLabel="activateDescLabel">
<rect key="frame" x="36" y="192" width="302" height="96"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<string key="text">Your account is created. Please check your mails to validate your account.
Once it is done, come back here and click on the button.</string>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="PR0-Gi-vU3" userLabel="checkValidationButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="340" width="299" height="40"/>
<rect key="frame" x="38" y="306" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Finish configuration">
<bool key="isElement" value="YES"/>
@ -328,14 +330,14 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="1038.5" y="176"/>
<point key="canvasLocation" x="1038.5" y="159"/>
</view>
<view contentMode="scaleToFill" id="52" userLabel="linphoneLoginView">
<rect key="frame" x="0.0" y="0.0" width="375" height="443"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="389"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="CONFIGURE LINPHONE ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="LbS-op-QAh" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -343,8 +345,8 @@
<nil key="highlightedColor"/>
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your username and password of your linphone.org account." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="4n3-ZD-KVi" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="29"/>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your username and password of Linphone account." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="4n3-ZD-KVi" userLabel="subtitleLabel">
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -353,14 +355,14 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" tag="120" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="USERNAME" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="zRE-5W-snR" userLabel="usernameLabel">
<rect key="frame" x="38" y="165" width="299" height="14"/>
<rect key="frame" x="38" y="131" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="100" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="YRW-ex-VZy" userLabel="usernameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="187" width="299" height="30"/>
<rect key="frame" x="38" y="153" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Username"/>
@ -373,21 +375,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid username" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="CBb-WR-x0g" userLabel="usernameErrorLabel">
<rect key="frame" x="38" y="217" width="299" height="10"/>
<rect key="frame" x="38" y="183" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PASSWORD" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="EXf-qZ-KVL" userLabel="passwordLabel">
<rect key="frame" x="38" y="236" width="299" height="14"/>
<rect key="frame" x="38" y="202" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="101" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="ap4-xh-CVK" userLabel="passwordField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="261" width="299" height="30"/>
<rect key="frame" x="38" y="227" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Password"/>
@ -400,28 +402,28 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid password" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="lMz-lo-z4b" userLabel="passwordErrorLabel">
<rect key="frame" x="38" y="291" width="299" height="10"/>
<rect key="frame" x="38" y="257" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DISPLAY NAME (OPTIONAL)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="emA-TJ-wRm" userLabel="displayNameLabel">
<rect key="frame" x="38" y="313" width="299" height="14"/>
<rect key="frame" x="38" y="279" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid display name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="YzC-qL-tc0" userLabel="displayNameErrorLabel">
<rect key="frame" x="38" y="365" width="299" height="10"/>
<rect key="frame" x="38" y="331" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="106" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="buh-Vp-YwP" userLabel="displayNameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="335" width="299" height="30"/>
<rect key="frame" x="38" y="301" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Display name"/>
@ -434,7 +436,7 @@
</connections>
</textField>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="eIr-bh-JLB" userLabel="linphoneLoginButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="383" width="299" height="40"/>
<rect key="frame" x="38" y="349" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Login">
<bool key="isElement" value="YES"/>
@ -454,14 +456,14 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="203.5" y="765.5"/>
<point key="canvasLocation" x="203.5" y="738.5"/>
</view>
<view contentMode="scaleToFill" id="56" userLabel="loginView">
<rect key="frame" x="0.0" y="0.0" width="374" height="610"/>
<rect key="frame" x="0.0" y="0.0" width="374" height="576"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="CONFIGURE SIP ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="wen-Vj-Wgv" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -470,7 +472,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Enter your username and password with your SIP domain." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="LsE-IY-ocU" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="29"/>
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -479,14 +481,14 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" tag="120" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="USERNAME" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="tAv-f7-kDI" userLabel="usernameLabel">
<rect key="frame" x="38" y="165" width="299" height="14"/>
<rect key="frame" x="38" y="131" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="100" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="FJ1-Xt-g7g" userLabel="usernameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="187" width="299" height="30"/>
<rect key="frame" x="38" y="153" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Username"/>
@ -499,21 +501,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid username" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="UJ1-kb-e8g" userLabel="usernameErrorLabel">
<rect key="frame" x="38" y="217" width="299" height="10"/>
<rect key="frame" x="38" y="183" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PASSWORD (OPTIONAL)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="XPq-fy-KZS" userLabel="passwordLabel">
<rect key="frame" x="38" y="236" width="299" height="14"/>
<rect key="frame" x="38" y="202" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="101" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="zEa-Dj-QiH" userLabel="passwordField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="261" width="299" height="30"/>
<rect key="frame" x="38" y="227" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Password"/>
@ -526,21 +528,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid password" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="Oyr-f0-auK" userLabel="passwordErrorLabel">
<rect key="frame" x="38" y="291" width="299" height="10"/>
<rect key="frame" x="38" y="257" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DOMAIN" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="MgC-eB-ar3" userLabel="domainLabel">
<rect key="frame" x="38" y="313" width="299" height="14"/>
<rect key="frame" x="38" y="279" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="104" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="5kh-Wo-SMY" userLabel="domainField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="335" width="299" height="30"/>
<rect key="frame" x="38" y="301" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Domain"/>
@ -553,21 +555,21 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid domain" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="ths-8b-FoU" userLabel="domainErrorLabel">
<rect key="frame" x="38" y="365" width="299" height="10"/>
<rect key="frame" x="38" y="331" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="TRANSPORT" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Uqz-B6-2gR" userLabel="transportLabel">
<rect key="frame" x="38" y="467" width="299" height="14"/>
<rect key="frame" x="38" y="433" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<segmentedControl opaque="NO" tag="110" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="bar" selectedSegmentIndex="2" id="Nrv-SM-lMf" userLabel="transportSegment">
<rect key="frame" x="36" y="489" width="299" height="29"/>
<rect key="frame" x="36" y="455" width="299" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<segments>
<segment title="UDP"/>
@ -580,14 +582,14 @@
</connections>
</segmentedControl>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DISPLAY NAME (OPTIONAL)" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="F0s-Da-L59" userLabel="displayNameLabel">
<rect key="frame" x="38" y="390" width="299" height="14"/>
<rect key="frame" x="38" y="356" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="106" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="7Cb-fa-CY5" userLabel="displayNameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="409" width="299" height="30"/>
<rect key="frame" x="38" y="375" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Display name"/>
@ -600,14 +602,14 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid display name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="3nU-NE-Lke" userLabel="displayNameErrorLabel">
<rect key="frame" x="38" y="439" width="299" height="10"/>
<rect key="frame" x="38" y="405" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="2Ch-Ji-vjA" userLabel="loginButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="550" width="299" height="40"/>
<rect key="frame" x="38" y="516" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Login">
<bool key="isElement" value="YES"/>
@ -627,14 +629,14 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="626" y="886"/>
<point key="canvasLocation" x="626" y="869"/>
</view>
<view contentMode="scaleToFill" id="Zuh-Sd-pcd" userLabel="remoteProvisioningView">
<rect key="frame" x="0.0" y="0.0" width="375" height="281"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="241"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="FETCH REMOTE CONFIGURATION" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="dpv-8C-qt6" userLabel="titleLabel">
<rect key="frame" x="36" y="20" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -643,7 +645,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Please provide your provisioning URL." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="hEy-Xe-afq" userLabel="subtitleLabel">
<rect key="frame" x="36" y="86" width="302" height="29"/>
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -652,14 +654,14 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="URL" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="0tr-gN-2Ce" userLabel="urlLabel">
<rect key="frame" x="38" y="151" width="299" height="14"/>
<rect key="frame" x="38" y="131" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="105" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="Ffg-Of-xyh" userLabel="urlField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="173" width="299" height="30"/>
<rect key="frame" x="38" y="153" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="URL"/>
@ -672,14 +674,14 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" tag="410" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Invalid URL" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="uEq-Gk-9iy" userLabel="urlErrorLabel">
<rect key="frame" x="38" y="203" width="299" height="10"/>
<rect key="frame" x="38" y="183" width="299" height="10"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="9"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="eM0-bn-v3C" userLabel="downloadButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="221" width="299" height="40"/>
<rect key="frame" x="38" y="201" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Fetch and apply">
<bool key="isElement" value="YES"/>
@ -699,14 +701,14 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="203.5" y="1175.5"/>
<point key="canvasLocation" x="203.5" y="1155.5"/>
</view>
<view contentMode="scaleToFill" id="xVK-hL-6pe" userLabel="remoteProvisioningLoginView">
<rect key="frame" x="0.0" y="0.0" width="375" height="413"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="379"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="CONFIGURE ACCOUNT" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" id="8ko-YU-KdD" userLabel="titleLabel">
<rect key="frame" x="36" y="34" width="302" height="59"/>
<rect key="frame" x="36" y="0.0" width="302" height="59"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="24"/>
@ -715,7 +717,7 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="These parameters were retrieved from a remote provisioning profile." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" minimumFontSize="10" id="njd-TT-zP8" userLabel="subtitleLabel">
<rect key="frame" x="36" y="100" width="302" height="29"/>
<rect key="frame" x="36" y="66" width="302" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Account setup assistant"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
@ -724,14 +726,14 @@
<size key="shadowOffset" width="-1" height="-1"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" tag="120" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="USERNAME" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="2tf-jf-LQL" userLabel="usernameLabel">
<rect key="frame" x="38" y="165" width="299" height="14"/>
<rect key="frame" x="38" y="131" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="100" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="qgP-7X-pUs" userLabel="usernameField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="187" width="299" height="30"/>
<rect key="frame" x="38" y="153" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Username"/>
@ -743,14 +745,14 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PASSWORD" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="JNj-cr-FwU" userLabel="passwordLabel">
<rect key="frame" x="38" y="226" width="299" height="14"/>
<rect key="frame" x="38" y="192" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="101" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="hfJ-yu-wVn" userLabel="passwordField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="251" width="299" height="30"/>
<rect key="frame" x="38" y="217" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Password"/>
@ -762,14 +764,14 @@
</connections>
</textField>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="DOMAIN" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="KTG-uK-Lji" userLabel="domainLabel">
<rect key="frame" x="38" y="293" width="299" height="14"/>
<rect key="frame" x="38" y="259" width="299" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.50196078430000002" green="0.50196078430000002" blue="0.50196078430000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" tag="104" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" adjustsFontSizeToFit="NO" minimumFontSize="10" id="gfr-KY-4vo" userLabel="domainField" customClass="UIAssistantTextField">
<rect key="frame" x="38" y="315" width="299" height="30"/>
<rect key="frame" x="38" y="281" width="299" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" red="0.88235294119999996" green="0.88235294119999996" blue="0.88235294119999996" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" label="Domain"/>
@ -781,7 +783,7 @@
</connections>
</textField>
<button opaque="NO" tag="130" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenHighlighted="NO" lineBreakMode="middleTruncation" id="eKs-or-rqw" userLabel="remoteProvisioningLoginButton" customClass="UIRoundBorderedButton">
<rect key="frame" x="38" y="353" width="299" height="40"/>
<rect key="frame" x="38" y="319" width="299" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Login">
<bool key="isElement" value="YES"/>
@ -801,7 +803,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="626.5" y="1450.5"/>
<point key="canvasLocation" x="626.5" y="1433.5"/>
</view>
</objects>
</document>

View file

@ -51,6 +51,9 @@
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="Cro-ww-VIC" userLabel="headerBar">
<rect key="frame" x="0.0" y="0.0" width="375" height="66"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" button="YES" notEnabled="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
<state key="normal" title="INCOMING CALL" backgroundImage="color_F.png">
<color key="titleColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@ -90,7 +93,7 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<view hidden="YES" tag="9" contentMode="scaleToFill" id="vIQ-QP-ooa" userLabel="tabVideoBar">
<rect key="frame" x="0.0" y="562" width="375" height="63"/>
@ -140,7 +143,7 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
@ -161,6 +164,9 @@
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="E9b-qt-GBq" userLabel="headerBar">
<rect key="frame" x="0.0" y="0.0" width="667" height="66"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" button="YES" notEnabled="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
<state key="normal" title="INCOMING CALL" backgroundImage="color_F.png">
<color key="titleColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@ -214,7 +220,7 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<view hidden="YES" tag="9" contentMode="scaleToFill" id="PPE-Fd-wDf" userLabel="tabVideoBar">
<rect key="frame" x="0.0" y="270" width="667" height="63"/>
@ -264,7 +270,7 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<imageView userInteractionEnabled="NO" tag="3" contentMode="scaleAspectFit" image="avatar.png" id="Q0C-CO-AYR" userLabel="avatarImage" customClass="UIRoundedImageView">
<rect key="frame" x="110" y="74" width="180" height="180"/>
@ -285,7 +291,7 @@
</view>
</objects>
<resources>
<image name="avatar.png" width="255" height="255"/>
<image name="avatar.png" width="1271" height="1271"/>
<image name="call_audio_start_default.png" width="36" height="36"/>
<image name="call_audio_start_disabled.png" width="36" height="36"/>
<image name="call_hangup_default.png" width="41" height="36"/>

View file

@ -34,6 +34,9 @@
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="NFl-sb-0TV" userLabel="headerBar">
<rect key="frame" x="0.0" y="0.0" width="375" height="66"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" button="YES" notEnabled="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
<state key="normal" title="OUTGOING CALL" backgroundImage="color_F.png">
<color key="titleColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@ -147,18 +150,6 @@
<state key="selected" image="micro_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
<button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="G7m-Av-QlR" userLabel="speakerButton" customClass="UISpeakerButton">
<rect key="frame" x="282" y="0.0" width="94" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Accept"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="speaker_default.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="speaker_disabled.png"/>
<state key="selected" image="speaker_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
<button hidden="YES" opaque="NO" tag="54" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="29K-Sd-aHF" userLabel="routesButton" customClass="UIToggleButton">
<rect key="frame" x="282" y="0.0" width="94" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
@ -174,6 +165,18 @@
<action selector="onRoutesClick:" destination="-1" eventType="touchUpInside" id="hXX-8a-7M4"/>
</connections>
</button>
<button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="G7m-Av-QlR" userLabel="speakerButton" customClass="UISpeakerButton">
<rect key="frame" x="282" y="0.0" width="94" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Accept"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="speaker_default.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="speaker_disabled.png"/>
<state key="selected" image="speaker_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
@ -218,6 +221,9 @@
<button opaque="NO" tag="2" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="oAv-Cz-FaR" userLabel="headerBar">
<rect key="frame" x="0.0" y="0.0" width="667" height="66"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" button="YES" notEnabled="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="boldSystem" pointSize="27"/>
<state key="normal" title="OUTGOING CALL" backgroundImage="color_F.png">
<color key="titleColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@ -344,18 +350,6 @@
<state key="selected" image="micro_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
<button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="5CY-aN-NLX" userLabel="speakerButton" customClass="UISpeakerButton">
<rect key="frame" x="501" y="0.0" width="167" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Accept"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="speaker_default.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="speaker_disabled.png"/>
<state key="selected" image="speaker_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
<button hidden="YES" opaque="NO" tag="54" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="61B-DK-jZ6" userLabel="routesButton" customClass="UIToggleButton">
<rect key="frame" x="501" y="0.0" width="167" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
@ -368,6 +362,18 @@
<state key="selected" image="routes_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
<button opaque="NO" tag="10" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="5CY-aN-NLX" userLabel="speakerButton" customClass="UISpeakerButton">
<rect key="frame" x="501" y="0.0" width="167" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Accept"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="speaker_default.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="speaker_disabled.png"/>
<state key="selected" image="speaker_selected.png"/>
<state key="highlighted" backgroundImage="color_E.png"/>
</button>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
@ -382,7 +388,7 @@
</view>
</objects>
<resources>
<image name="avatar.png" width="255" height="255"/>
<image name="avatar.png" width="1271" height="1271"/>
<image name="call_hangup_default.png" width="41" height="36"/>
<image name="call_hangup_disabled.png" width="41" height="36"/>
<image name="color_D.png" width="2" height="2"/>

View file

@ -195,11 +195,11 @@
<subviews>
<imageView userInteractionEnabled="NO" tag="17" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="waiting_time.png" id="DH6-pH-W9j" userLabel="pausedImage">
<rect key="frame" x="0.0" y="135" width="375" height="71"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" tag="18" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You are paused by remote" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="OgZ-xf-k7s" userLabel="pausedLabel">
<rect key="frame" x="0.0" y="175" width="375" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@ -227,11 +227,11 @@
<subviews>
<imageView userInteractionEnabled="NO" tag="21" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="waiting_time.png" id="4uU-gc-9XK" userLabel="pausedImage">
<rect key="frame" x="0.0" y="200" width="375" height="71"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" tag="22" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No active call" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="b5q-sb-qbU" userLabel="pausedLabel">
<rect key="frame" x="0.0" y="241" width="375" height="100"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@ -789,11 +789,11 @@
<subviews>
<imageView userInteractionEnabled="NO" tag="17" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="waiting_time.png" id="oQ7-Ye-Vf5" userLabel="pausedImage">
<rect key="frame" x="276" y="15" width="114" height="75"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" tag="18" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You are paused by remote" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="AK5-tl-4a6" userLabel="pausedLabel">
<rect key="frame" x="146" y="91" width="375" height="47"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
@ -821,11 +821,11 @@
<subviews>
<imageView userInteractionEnabled="NO" tag="21" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="waiting_time.png" id="8Pf-Le-JDT" userLabel="pausedImage">
<rect key="frame" x="276" y="80" width="114" height="75"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" tag="22" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="No active call" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" id="Abl-Ep-xm0" userLabel="pausedLabel">
<rect key="frame" x="146" y="156" width="375" height="47"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>

View file

@ -512,6 +512,68 @@
<rect key="frame" x="0.0" y="1185" width="800" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<view tag="56" contentMode="scaleToFill" id="8q9-3P-Fz0" userLabel="lowerBar">
<rect key="frame" x="0.0" y="0.0" width="400" height="63"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" tag="57" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="SRu-dB-r3e" userLabel="numpadButton" customClass="UIToggleButton">
<rect key="frame" x="0.0" y="0.0" width="100" height="63"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Back"/>
<state key="normal" image="footer_dialer_default.png" backgroundImage="color_C.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="footer_dialer_disabled.png"/>
<state key="selected" image="dialer_alt_back.png"/>
<state key="highlighted" backgroundImage="color_A.png"/>
<connections>
<action selector="onNumpadClick:" destination="-1" eventType="touchUpInside" id="pFD-jh-GhK"/>
</connections>
</button>
<button opaque="NO" tag="58" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Xpw-A4-BZO" userLabel="hangupButton" customClass="UIHangUpButton">
<rect key="frame" x="100" y="0.0" width="200" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Hangup"/>
<state key="normal" image="call_hangup_default.png" backgroundImage="color_D.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted" backgroundImage="color_I.png"/>
</button>
<button opaque="NO" tag="59" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="t7u-65-OPV" userLabel="chatButton" customClass="UIIconButton">
<rect key="frame" x="300" y="0.0" width="100" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Hangup"/>
<state key="normal" image="footer_chat_default.png" backgroundImage="color_C.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted" backgroundImage="color_A.png"/>
<connections>
<action selector="onChatClick:" destination="-1" eventType="touchUpInside" id="Jdk-1s-UnN"/>
</connections>
</button>
<view hidden="YES" autoresizesSubviews="NO" userInteractionEnabled="NO" tag="70" contentMode="scaleToFill" id="d9Y-2a-CDI" userLabel="chatNotificationView" customClass="UIBouncingView">
<rect key="frame" x="353" y="8" width="44" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="71" contentMode="scaleAspectFit" image="history_chat_indicator.png" id="nPO-PM-4zJ" userLabel="chatNotificationImage">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="72" contentMode="left" text="99" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="7" id="Saa-p5-chV" userLabel="chatNotificationLabel">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Missed message(s)">
<accessibilityTraits key="traits" none="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
</subviews>
</view>
<view tag="48" contentMode="scaleToFill" id="OIH-ek-VgL" userLabel="higherBar">
<rect key="frame" x="400" y="0.0" width="400" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" heightSizable="YES" flexibleMaxY="YES"/>
@ -595,68 +657,6 @@
</button>
</subviews>
</view>
<view tag="56" contentMode="scaleToFill" id="8q9-3P-Fz0" userLabel="lowerBar">
<rect key="frame" x="0.0" y="0.0" width="400" height="63"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
<subviews>
<button opaque="NO" tag="57" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="SRu-dB-r3e" userLabel="numpadButton" customClass="UIToggleButton">
<rect key="frame" x="0.0" y="0.0" width="100" height="63"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Back"/>
<state key="normal" image="footer_dialer_default.png" backgroundImage="color_C.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="footer_dialer_disabled.png"/>
<state key="selected" image="dialer_alt_back.png"/>
<state key="highlighted" backgroundImage="color_A.png"/>
<connections>
<action selector="onNumpadClick:" destination="-1" eventType="touchUpInside" id="pFD-jh-GhK"/>
</connections>
</button>
<button opaque="NO" tag="58" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Xpw-A4-BZO" userLabel="hangupButton" customClass="UIHangUpButton">
<rect key="frame" x="100" y="0.0" width="200" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Hangup"/>
<state key="normal" image="call_hangup_default.png" backgroundImage="color_D.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted" backgroundImage="color_I.png"/>
</button>
<button opaque="NO" tag="59" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="t7u-65-OPV" userLabel="chatButton" customClass="UIIconButton">
<rect key="frame" x="300" y="0.0" width="100" height="63"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<accessibility key="accessibilityConfiguration" label="Hangup"/>
<state key="normal" image="footer_chat_default.png" backgroundImage="color_C.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted" backgroundImage="color_A.png"/>
<connections>
<action selector="onChatClick:" destination="-1" eventType="touchUpInside" id="Jdk-1s-UnN"/>
</connections>
</button>
<view hidden="YES" autoresizesSubviews="NO" userInteractionEnabled="NO" tag="70" contentMode="scaleToFill" id="d9Y-2a-CDI" userLabel="chatNotificationView" customClass="UIBouncingView">
<rect key="frame" x="353" y="8" width="44" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="71" contentMode="scaleAspectFit" image="history_chat_indicator.png" id="nPO-PM-4zJ" userLabel="chatNotificationImage">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="72" contentMode="left" text="99" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="7" id="Saa-p5-chV" userLabel="chatNotificationLabel">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Missed message(s)">
<accessibilityTraits key="traits" none="YES"/>
</accessibility>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view>
</subviews>
</view>
</subviews>
</view>
</subviews>
@ -833,7 +833,7 @@
<color key="backgroundColor" red="0.2666666667" green="0.2666666667" blue="0.2666666667" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<tableView clipsSubviews="YES" tag="23" contentMode="scaleToFill" bounces="NO" scrollEnabled="NO" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" style="grouped" allowsSelection="NO" rowHeight="50" sectionHeaderHeight="1" sectionFooterHeight="1" id="Yha-y8-ihb" userLabel="pausedCallsTableView">
<rect key="frame" x="0.0" y="645" width="646" height="50"/>
<rect key="frame" x="0.0" y="645" width="400" height="50"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="separatorColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
@ -96,7 +96,7 @@
<action selector="onCallClick:" destination="-1" eventType="touchUpInside" id="Dsf-nS-K3V"/>
</connections>
</button>
<button opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Hc0-GX-fC5" userLabel="backToCallButton" customClass="UIBackToCallButton">
<button hidden="YES" opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="Hc0-GX-fC5" userLabel="backToCallButton" customClass="UIBackToCallButton">
<rect key="frame" x="225" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<state key="normal" image="call_back_default.png">
@ -346,7 +346,7 @@
<action selector="onCallClick:" destination="-1" eventType="touchUpInside" id="gcb-ac-VkW"/>
</connections>
</button>
<button opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="t25-en-4LP" userLabel="backToCallButton" customClass="UIBackToCallButton">
<button hidden="YES" opaque="NO" tag="7" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="t25-en-4LP" userLabel="backToCallButton" customClass="UIBackToCallButton">
<rect key="frame" x="496" y="0.0" width="75" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES"/>
<state key="normal" image="call_back_default.png">

View file

@ -7,7 +7,6 @@
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="DialerView">
<connections>
<outlet property="addCallButton" destination="184" id="227"/>
<outlet property="addContactButton" destination="222" id="225"/>
<outlet property="addressField" destination="4" id="205"/>
<outlet property="backButton" destination="183" id="d75-ly-K6w"/>
@ -26,7 +25,6 @@
<outlet property="sixButton" destination="33" id="196"/>
<outlet property="starButton" destination="39" id="199"/>
<outlet property="threeButton" destination="29" id="193"/>
<outlet property="transferButton" destination="236" id="253"/>
<outlet property="twoButton" destination="37" id="192"/>
<outlet property="view" destination="171" id="176"/>
<outlet property="zeroButton" destination="40" id="198"/>
@ -289,34 +287,6 @@
<outlet property="addressField" destination="4" id="235"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="236" userLabel="transferButton" customClass="UITransferButton">
<rect key="frame" x="180" y="0.0" width="360" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Transfer call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_transfer_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_transfer_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="4" id="237"/>
</connections>
</button>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="184" userLabel="addCallButton" customClass="UICallButton">
<rect key="frame" x="180" y="0.0" width="360" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Add call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_add_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_add_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="4" id="234"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
@ -333,14 +303,10 @@
<image name="backspace_default.png" width="36" height="19"/>
<image name="backspace_disabled.png" width="36" height="19"/>
<image name="backspace_over.png" width="36" height="19"/>
<image name="call_add_default.png" width="39" height="35"/>
<image name="call_add_disabled.png" width="39" height="35"/>
<image name="call_alt_back_default.png" width="50" height="36"/>
<image name="call_alt_back_disabled.png" width="50" height="36"/>
<image name="call_audio_start_default.png" width="36" height="36"/>
<image name="call_audio_start_disabled.png" width="36" height="36"/>
<image name="call_transfer_default.png" width="40" height="36"/>
<image name="call_transfer_disabled.png" width="40" height="36"/>
<image name="color_A.png" width="2" height="2"/>
<image name="color_E.png" width="2" height="2"/>
<image name="color_F.png" width="2" height="2"/>

View file

@ -7,7 +7,6 @@
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="DialerView">
<connections>
<outlet property="addCallButton" destination="184" id="227"/>
<outlet property="addContactButton" destination="222" id="225"/>
<outlet property="addressField" destination="4" id="205"/>
<outlet property="backButton" destination="183" id="d75-ly-K6w"/>
@ -25,7 +24,6 @@
<outlet property="sixButton" destination="33" id="196"/>
<outlet property="starButton" destination="39" id="199"/>
<outlet property="threeButton" destination="29" id="193"/>
<outlet property="transferButton" destination="236" id="253"/>
<outlet property="twoButton" destination="37" id="192"/>
<outlet property="videoPreview" destination="30b-JN-Ibj" id="Kwj-av-WIg"/>
<outlet property="view" destination="171" id="176"/>
@ -302,34 +300,6 @@
<outlet property="addressField" destination="4" id="235"/>
</connections>
</button>
<button hidden="YES" opaque="NO" tag="26" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="236" userLabel="transferButton" customClass="UITransferButton">
<rect key="frame" x="102" y="0.0" width="208" height="80"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Transfer call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_transfer_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_transfer_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="4" id="237"/>
</connections>
</button>
<button hidden="YES" opaque="NO" tag="27" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="184" userLabel="addCallButton" customClass="UICallButton">
<rect key="frame" x="102" y="0.0" width="208" height="80"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Add call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_add_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_add_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="4" id="234"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
@ -628,34 +598,6 @@
<outlet property="addressField" destination="Omx-NU-xKz" id="L5w-fg-hu4"/>
</connections>
</button>
<button hidden="YES" opaque="NO" tag="26" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="sgE-tf-F5m" userLabel="transferButton" customClass="UITransferButton">
<rect key="frame" x="101" y="0.0" width="207" height="80"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Transfer call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_transfer_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_transfer_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="Omx-NU-xKz" id="SO9-Af-1mi"/>
</connections>
</button>
<button hidden="YES" opaque="NO" tag="27" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="4rB-ub-Jg9" userLabel="addCallButton" customClass="UICallButton">
<rect key="frame" x="101" y="0.0" width="207" height="80"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Add call"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" image="call_add_default.png" backgroundImage="color_A.png">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="disabled" image="call_add_disabled.png"/>
<state key="highlighted" backgroundImage="color_L.png"/>
<connections>
<outlet property="addressField" destination="Omx-NU-xKz" id="WsE-IC-wXp"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
@ -691,14 +633,10 @@
<image name="backspace_default.png" width="36" height="19"/>
<image name="backspace_disabled.png" width="36" height="19"/>
<image name="backspace_over.png" width="36" height="19"/>
<image name="call_add_default.png" width="39" height="35"/>
<image name="call_add_disabled.png" width="39" height="35"/>
<image name="call_alt_back_default.png" width="50" height="36"/>
<image name="call_alt_back_disabled.png" width="50" height="36"/>
<image name="call_audio_start_default.png" width="36" height="36"/>
<image name="call_audio_start_disabled.png" width="36" height="36"/>
<image name="call_transfer_default.png" width="40" height="36"/>
<image name="call_transfer_disabled.png" width="40" height="36"/>
<image name="camera_switch_default.png" width="51" height="50"/>
<image name="camera_switch_disabled.png" width="51" height="50"/>
<image name="camera_switch_over.png" width="51" height="50"/>

View file

@ -8,9 +8,8 @@
#import <UIKit/UIKit.h>
@interface CallConferenceTableView : UITableViewController {
@private
NSTimer *updateTime;
}
@interface CallConferenceTableView : UITableViewController
- (void)update;
@end

View file

@ -24,22 +24,6 @@
@implementation CallConferenceTableView
#pragma mark - ViewController Functions
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
updateTime =
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (updateTime != nil) {
[updateTime invalidate];
updateTime = nil;
}
}
#pragma mark - UI change
- (void)update {

View file

@ -38,8 +38,8 @@
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[NSNotificationCenter.defaultCenter removeObserver:self name:kLinphoneCallUpdate object:nil];
_call = NULL;
}
#pragma mark - UICompositeViewDelegate Functions
@ -64,6 +64,13 @@ static UICompositeViewDescription *compositeDescription = nil;
return self.class.compositeViewDescription;
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
if (_call) {
[self update];
}
}
#pragma mark - Event Functions
- (void)callUpdateEvent:(NSNotification *)notif {
@ -75,7 +82,6 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)callUpdate:(LinphoneCall *)acall state:(LinphoneCallState)astate {
if (_call == acall && (astate == LinphoneCallEnd || astate == LinphoneCallError)) {
[_delegate incomingCallAborted:_call];
[self dismiss];
} else if ([LinphoneManager.instance lpConfigBoolForKey:@"auto_answer"]) {
LinphoneCallState state = linphone_call_get_state(_call);
if (state == LinphoneCallIncomingReceived) {
@ -87,12 +93,6 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark -
- (void)dismiss {
if ([[PhoneMainView.instance currentView] equal:CallIncomingView.compositeViewDescription]) {
[PhoneMainView.instance popCurrentView];
}
}
- (void)update {
const LinphoneAddress *addr = linphone_call_get_remote_address(_call);
[ContactDisplay setDisplayNameLabel:_nameLabel forAddress:addr];
@ -116,17 +116,14 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark - Action Functions
- (IBAction)onAcceptClick:(id)event {
[self dismiss];
[_delegate incomingCallAccepted:_call evenWithVideo:YES];
}
- (IBAction)onDeclineClick:(id)event {
[self dismiss];
[_delegate incomingCallDeclined:_call];
}
- (IBAction)onAcceptAudioOnlyClick:(id)sender {
[self dismiss];
[_delegate incomingCallAccepted:_call evenWithVideo:NO];
}

View file

@ -45,6 +45,10 @@ static UICompositeViewDescription *compositeDescription = nil;
return self.class.compositeViewDescription;
}
- (void)viewDidLoad {
_routesEarpieceButton.enabled = !IPAD;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
@ -109,9 +113,6 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)hideRoutes:(BOOL)hidden animated:(BOOL)animated {
if (IPAD)
return;
if (hidden) {
[_routesButton setOff];
} else {
@ -128,8 +129,6 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (void)hideSpeaker:(BOOL)hidden {
if (IPAD)
return;
_speakerButton.hidden = hidden;
_routesButton.hidden = !hidden;
}

View file

@ -19,9 +19,8 @@
#import <UIKit/UIKit.h>
@interface CallPausedTableView : UITableViewController {
@private
NSTimer *updateTime;
}
@interface CallPausedTableView : UITableViewController
- (void)update;
@end

View file

@ -24,22 +24,6 @@
@implementation CallPausedTableView
#pragma mark - ViewController Functions
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
updateTime =
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (updateTime != nil) {
[updateTime invalidate];
updateTime = nil;
}
}
#pragma mark - UI change
- (void)update {

View file

@ -143,6 +143,12 @@
NSMutableString *stats = [[NSMutableString alloc] init];
LinphoneMediaEncryption enc = linphone_call_params_get_media_encryption(linphone_call_get_current_params(call));
if (enc != LinphoneMediaEncryptionNone) {
[stats appendString:[NSString
stringWithFormat:@"Call encrypted using %s", linphone_media_encryption_to_string(enc)]];
}
[stats appendString:[self updateStatsForCall:call stream:LinphoneStreamTypeAudio]];
[stats appendString:[self updateStatsForCall:call stream:LinphoneStreamTypeVideo]];
[stats appendString:[self updateStatsForCall:call stream:LinphoneStreamTypeText]];

View file

@ -77,9 +77,14 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)viewDidLoad {
[super viewDidLoad];
_routesEarpieceButton.enabled = !IPAD;
// TODO: fixme! video preview frame is too big compared to openGL preview
// frame, so until this is fixed, temporary disabled it.
#if 0
_videoPreview.layer.borderColor = UIColor.whiteColor.CGColor;
_videoPreview.layer.borderWidth = 1;
#endif
[singleFingerTap setNumberOfTapsRequired:1];
[singleFingerTap setCancelsTouchesInView:FALSE];
[self.videoView addGestureRecognizer:singleFingerTap];
@ -131,12 +136,11 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
LinphoneManager.instance.nextCallIsTransfer = NO;
[self updateUnreadMessage:FALSE];
// Update on show
LinphoneCall *call = linphone_core_get_current_call(LC);
LinphoneCallState state = (call != NULL) ? linphone_call_get_state(call) : 0;
[self callUpdate:call state:state animated:FALSE];
[self hideRoutes:TRUE animated:FALSE];
[self hideOptions:TRUE animated:FALSE];
[self hidePad:TRUE animated:FALSE];
@ -180,6 +184,11 @@ static UICompositeViewDescription *compositeDescription = nil;
[PhoneMainView.instance setVolumeHidden:TRUE];
hiddenVolume = TRUE;
// we must wait didAppear to reset fullscreen mode because we cannot change it in viewwillappear
LinphoneCall *call = linphone_core_get_current_call(LC);
LinphoneCallState state = (call != NULL) ? linphone_call_get_state(call) : 0;
[self callUpdate:call state:state animated:FALSE];
}
- (void)viewWillDisappear:(BOOL)animated {
@ -242,8 +251,6 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
- (void)updateBottomBar:(LinphoneCall *)call state:(LinphoneCallState)state {
LinphoneCore *lc = LC;
[_speakerButton update];
[_microButton update];
[_callPauseButton update];
@ -254,9 +261,9 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
_optionsButton.enabled = (!call || !linphone_call_media_in_progress(call));
_optionsTransferButton.enabled = call && !linphone_call_media_in_progress(call);
// Show Pause/Conference button following call count
if (linphone_core_get_calls_nb(lc) > 1) {
bool enabled = ((linphone_core_get_current_call(lc) != NULL) || linphone_core_is_in_conference(lc));
const MSList *list = linphone_core_get_calls(lc);
if (linphone_core_get_calls_nb(LC) > 1) {
bool enabled = ((linphone_core_get_current_call(LC) != NULL) || linphone_core_is_in_conference(LC));
const MSList *list = linphone_core_get_calls(LC);
while (list != NULL) {
LinphoneCall *call = (LinphoneCall *)list->data;
LinphoneCallState state = linphone_call_get_state(call);
@ -273,7 +280,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
// Disable transfert in conference
if (linphone_core_get_current_call(lc) == NULL) {
if (linphone_core_get_current_call(LC) == NULL) {
[_optionsTransferButton setEnabled:FALSE];
} else {
[_optionsTransferButton setEnabled:TRUE];
@ -393,7 +400,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
[self disableVideoDisplay:FALSE animated:animated];
}
- (void)displayTableCall:(BOOL)animated {
- (void)displayAudioCall:(BOOL)animated {
[self disableVideoDisplay:TRUE animated:animated];
}
@ -408,16 +415,18 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
int duration =
linphone_core_get_current_call(LC) ? linphone_call_get_duration(linphone_core_get_current_call(LC)) : 0;
_durationLabel.text = [LinphoneUtils durationToString:duration];
[_pausedCallsTable update];
[_conferenceCallsTable update];
}
- (void)onCurrentCallChange {
LinphoneCore *lc = LC;
LinphoneCall *call = linphone_core_get_current_call(lc);
LinphoneCall *call = linphone_core_get_current_call(LC);
_noActiveCallView.hidden = (call || linphone_core_is_in_conference(lc));
_noActiveCallView.hidden = (call || linphone_core_is_in_conference(LC));
_callView.hidden = !call;
_conferenceView.hidden = !linphone_core_is_in_conference(lc);
_callPauseButton.hidden = !call && !linphone_core_is_in_conference(lc);
_conferenceView.hidden = !linphone_core_is_in_conference(LC);
_callPauseButton.hidden = !call && !linphone_core_is_in_conference(LC);
[_callPauseButton setType:UIPauseButtonType_CurrentCall call:call];
[_conferencePauseButton setType:UIPauseButtonType_Conference call:call];
@ -447,9 +456,6 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
- (void)hideRoutes:(BOOL)hidden animated:(BOOL)animated {
if (IPAD)
return;
if (hidden) {
[_routesButton setOff];
} else {
@ -485,8 +491,6 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
- (void)hideSpeaker:(BOOL)hidden {
if (IPAD)
return;
_speakerButton.hidden = hidden;
_routesButton.hidden = !hidden;
}
@ -505,7 +509,6 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
- (void)callUpdate:(LinphoneCall *)call state:(LinphoneCallState)state animated:(BOOL)animated {
LinphoneCore *lc = LC;
[self updateBottomBar:call state:state];
if (hiddenVolume) {
[PhoneMainView.instance setVolumeHidden:FALSE];
@ -513,12 +516,12 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
}
// Update tables
[_pausedCallsTable.tableView reloadData];
[_conferenceCallsTable.tableView reloadData];
[_pausedCallsTable update];
[_conferenceCallsTable update];
static LinphoneCall *currentCall = NULL;
if (!currentCall || linphone_core_get_current_call(lc) != currentCall) {
currentCall = linphone_core_get_current_call(lc);
if (!currentCall || linphone_core_get_current_call(LC) != currentCall) {
currentCall = linphone_core_get_current_call(LC);
[self onCurrentCallChange];
}
@ -527,6 +530,16 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
return;
}
BOOL shouldDisableVideo =
(!currentCall || !linphone_call_params_video_enabled(linphone_call_get_current_params(currentCall)));
if (videoHidden != shouldDisableVideo) {
if (!shouldDisableVideo) {
[self displayVideoCall:animated];
} else {
[self displayAudioCall:animated];
}
}
if (state != LinphoneCallPausedByRemote) {
_pausedByRemoteView.hidden = YES;
}
@ -537,10 +550,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
case LinphoneCallConnected:
case LinphoneCallStreamsRunning: {
// check video
if (linphone_call_params_video_enabled(linphone_call_get_current_params(call))) {
[self displayVideoCall:animated];
} else {
[self displayTableCall:animated];
if (!linphone_call_params_video_enabled(linphone_call_get_current_params(call))) {
const LinphoneCallParams *param = linphone_call_get_current_params(call);
const LinphoneCallAppData *callAppData =
(__bridge const LinphoneCallAppData *)(linphone_call_get_user_pointer(call));
@ -566,22 +576,23 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
const LinphoneCallParams *remote = linphone_call_get_remote_params(call);
/* remote wants to add video */
if (linphone_core_video_display_enabled(lc) && !linphone_call_params_video_enabled(current) &&
if (linphone_core_video_display_enabled(LC) && !linphone_call_params_video_enabled(current) &&
linphone_call_params_video_enabled(remote) &&
!linphone_core_get_video_policy(lc)->automatically_accept) {
linphone_core_defer_call_update(lc, call);
!linphone_core_get_video_policy(LC)->automatically_accept) {
linphone_core_defer_call_update(LC, call);
[self displayAskToEnableVideoCall:call];
} else if (linphone_call_params_video_enabled(current) && !linphone_call_params_video_enabled(remote)) {
[self displayTableCall:animated];
[self displayAudioCall:animated];
}
break;
}
case LinphoneCallPausing:
case LinphoneCallPaused:
[self displayTableCall:animated];
[self displayAudioCall:animated];
break;
case LinphoneCallPausedByRemote:
if (call == linphone_core_get_current_call(lc)) {
[self displayAudioCall:animated];
if (call == linphone_core_get_current_call(LC)) {
_pausedByRemoteView.hidden = NO;
}
break;
@ -664,7 +675,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:0.3
animations:^{
LOGI(@"Recentering preview to %@", NSStringFromCGRect(previewFrame));
LOGD(@"Recentering preview to %@", NSStringFromCGRect(previewFrame));
_videoPreview.frame = previewFrame;
}];
});
@ -713,7 +724,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
[self hideOptions:TRUE animated:TRUE];
DialerView *view = VIEW(DialerView);
[view setAddress:@""];
[view setTransferMode:TRUE];
LinphoneManager.instance.nextCallIsTransfer = YES;
[PhoneMainView.instance changeCurrentView:view.compositeViewDescription];
}
@ -721,7 +732,7 @@ static void hideSpinner(LinphoneCall *call, void *user_data) {
[self hideOptions:TRUE animated:TRUE];
DialerView *view = VIEW(DialerView);
[view setAddress:@""];
[view setTransferMode:FALSE];
LinphoneManager.instance.nextCallIsTransfer = NO;
[PhoneMainView.instance changeCurrentView:view.compositeViewDescription];
}

View file

@ -45,7 +45,7 @@
}];
// also add current entry, if not listed
NSString *nsuri = filter.lowercaseString;
LinphoneAddress *addr = linphone_core_interpret_url(LC, nsuri.UTF8String);
LinphoneAddress *addr = linphone_address_new(nsuri.UTF8String);
if (addr) {
char *uri = linphone_address_as_string(addr);
nsuri = [NSString stringWithUTF8String:uri];

View file

@ -41,10 +41,7 @@
#pragma mark -
- (void)clearMessageList {
if (messageList) {
ms_list_free_with_data(messageList, (void (*)(void *))linphone_chat_message_unref);
messageList = nil;
}
messageList = ms_list_free_with_data(messageList, (void (*)(void *))linphone_chat_message_unref);
}
- (void)updateData {
@ -72,6 +69,14 @@
}
- (void)addChatEntry:(LinphoneChatMessage *)chat {
// do not add the same message multiple times. It can happen on iPad since in fragment
// mode, "message received" notification will reload tabledata, retrieving all history
// and THEN addChatEntry will be called, requesting the newest message to be added again
if (messageList &&
(linphone_chat_message_get_storage_id(chat) ==
linphone_chat_message_get_storage_id(ms_list_nth_data(messageList, ms_list_size(messageList) - 1)))) {
return;
}
messageList = ms_list_append(messageList, linphone_chat_message_ref(chat));
int pos = ms_list_size(messageList) - 1;

View file

@ -78,7 +78,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
_messageField.minNumberOfLines = 1;
_messageField.maxNumberOfLines = ([LinphoneManager runningOnIpad]) ? 10 : 3;
_messageField.maxNumberOfLines = IPAD ? 10 : 3;
_messageField.delegate = self;
_messageField.font = [UIFont systemFontOfSize:18.0f];
_messageField.contentInset = UIEdgeInsetsMake(-15, 0, 0, 0);
@ -320,12 +320,12 @@ static UICompositeViewDescription *compositeDescription = nil;
if (from == NULL || chat == NULL) {
return;
}
char *fromStr = linphone_address_as_string_uri_only(from);
const LinphoneAddress *cr_from = linphone_chat_room_get_peer_address(chatRoom);
char *cr_from_string = linphone_address_as_string_uri_only(cr_from);
if (fromStr && cr_from_string) {
if (strcasecmp(cr_from_string, fromStr) == 0) {
if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) {
linphone_chat_room_mark_as_read(room);
@ -515,7 +515,7 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (IBAction)onCallClick:(id)sender {
[LinphoneManager.instance call:linphone_chat_room_get_peer_address(chatRoom) transfer:NO];
[LinphoneManager.instance call:linphone_chat_room_get_peer_address(chatRoom)];
}
- (IBAction)onListSwipe:(id)sender {

View file

@ -121,7 +121,7 @@ static void chatTable_free_chatrooms(void *data) {
if (IPAD) {
// reset conversation view since in fragment mode, conversations are relative to current data
// select first conversation if any
if ([self totalNumberOfItems] > 0) {
if (data != NULL) {
ChatConversationView *view = VIEW(ChatConversationView);
[view setChatRoom:(LinphoneChatRoom *)ms_list_nth_data(data, 0)];
}

View file

@ -108,6 +108,14 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark - ViewController Functions
- (void)viewDidLoad {
[super viewDidLoad];
[self changeView:ContactsLinphone];
if ([tableController totalNumberOfItems] == 0) {
[self changeView:ContactsAll];
}
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
@ -135,11 +143,6 @@ static UICompositeViewDescription *compositeDescription = nil;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self changeView:ContactsAll];
}
#pragma mark -
- (void)changeView:(ContactsCategory)view {

View file

@ -23,22 +23,16 @@
#import "UICamSwitch.h"
#import "UICallButton.h"
#import "UITransferButton.h"
#import "UIDigitButton.h"
@interface DialerView
: TPMultiLayoutViewController <UITextFieldDelegate, UICompositeViewDelegate, MFMailComposeViewControllerDelegate> {
}
- (void)setAddress:(NSString *)address;
@property(nonatomic, assign) BOOL transferMode;
@property(nonatomic, strong) IBOutlet UITextField *addressField;
@property(nonatomic, strong) IBOutlet UIButton *addContactButton;
@property(nonatomic, strong) IBOutlet UICallButton *callButton;
@property(nonatomic, strong) IBOutlet UICallButton *addCallButton;
@property(nonatomic, strong) IBOutlet UITransferButton *transferButton;
@property(nonatomic, strong) IBOutlet UIButton *backButton;
@property(weak, nonatomic) IBOutlet UIIconButton *backspaceButton;
@ -64,4 +58,6 @@
- (IBAction)onAddressChange:(id)sender;
- (IBAction)onBackspaceClick:(id)sender;
- (void)setAddress:(NSString *)address;
@end

View file

@ -25,48 +25,6 @@
@implementation DialerView
@synthesize transferMode;
@synthesize addressField;
@synthesize addContactButton;
@synthesize backButton;
@synthesize addCallButton;
@synthesize transferButton;
@synthesize callButton;
@synthesize backspaceButton;
@synthesize oneButton;
@synthesize twoButton;
@synthesize threeButton;
@synthesize fourButton;
@synthesize fiveButton;
@synthesize sixButton;
@synthesize sevenButton;
@synthesize eightButton;
@synthesize nineButton;
@synthesize starButton;
@synthesize zeroButton;
@synthesize hashButton;
@synthesize backgroundView;
@synthesize videoPreview;
@synthesize videoCameraSwitch;
#pragma mark - Lifecycle Functions
- (id)init {
self = [super initWithNibName:NSStringFromClass(self.class) bundle:[NSBundle mainBundle]];
if (self) {
transferMode = FALSE;
}
return self;
}
- (void)dealloc {
// Remove all observers
[NSNotificationCenter.defaultCenter removeObserver:self];
}
#pragma mark - UICompositeViewDelegate Functions
static UICompositeViewDescription *compositeDescription = nil;
@ -108,42 +66,35 @@ static UICompositeViewDescription *compositeDescription = nil;
name:kLinphoneCoreUpdate
object:nil];
// technically not needed, but older versions of linphone had this button
// disabled by default. In this case, updating by pushing a new version with
// xcode would result in the callbutton being disabled all the time.
// We force it enabled anyway now.
[callButton setEnabled:TRUE];
// Update on show
LinphoneManager *mgr = LinphoneManager.instance;
LinphoneCore *lc = LC;
LinphoneCall *call = linphone_core_get_current_call(lc);
LinphoneCall *call = linphone_core_get_current_call(LC);
LinphoneCallState state = (call != NULL) ? linphone_call_get_state(call) : 0;
[self callUpdate:call state:state];
if (IPAD) {
BOOL videoEnabled = linphone_core_video_display_enabled(lc);
BOOL videoEnabled = linphone_core_video_display_enabled(LC);
BOOL previewPref = [mgr lpConfigBoolForKey:@"preview_preference"];
if (videoEnabled && previewPref) {
linphone_core_set_native_preview_window_id(lc, (__bridge void *)(videoPreview));
linphone_core_set_native_preview_window_id(LC, (__bridge void *)(_videoPreview));
if (!linphone_core_video_preview_enabled(lc)) {
linphone_core_enable_video_preview(lc, TRUE);
if (!linphone_core_video_preview_enabled(LC)) {
linphone_core_enable_video_preview(LC, TRUE);
}
[backgroundView setHidden:FALSE];
[videoCameraSwitch setHidden:FALSE];
[_backgroundView setHidden:FALSE];
[_videoCameraSwitch setHidden:FALSE];
} else {
linphone_core_set_native_preview_window_id(lc, NULL);
linphone_core_enable_video_preview(lc, FALSE);
[backgroundView setHidden:TRUE];
[videoCameraSwitch setHidden:TRUE];
linphone_core_set_native_preview_window_id(LC, NULL);
linphone_core_enable_video_preview(LC, FALSE);
[_backgroundView setHidden:TRUE];
[_videoCameraSwitch setHidden:TRUE];
}
} else {
linphone_core_enable_video_preview(lc, FALSE);
linphone_core_enable_video_preview(LC, FALSE);
}
[addressField setText:@""];
[_addressField setText:@""];
}
- (void)viewWillDisappear:(BOOL)animated {
@ -154,37 +105,37 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)viewDidLoad {
[super viewDidLoad];
[zeroButton setDigit:'0'];
[oneButton setDigit:'1'];
[twoButton setDigit:'2'];
[threeButton setDigit:'3'];
[fourButton setDigit:'4'];
[fiveButton setDigit:'5'];
[sixButton setDigit:'6'];
[sevenButton setDigit:'7'];
[eightButton setDigit:'8'];
[nineButton setDigit:'9'];
[starButton setDigit:'*'];
[hashButton setDigit:'#'];
[_zeroButton setDigit:'0'];
[_oneButton setDigit:'1'];
[_twoButton setDigit:'2'];
[_threeButton setDigit:'3'];
[_fourButton setDigit:'4'];
[_fiveButton setDigit:'5'];
[_sixButton setDigit:'6'];
[_sevenButton setDigit:'7'];
[_eightButton setDigit:'8'];
[_nineButton setDigit:'9'];
[_starButton setDigit:'*'];
[_hashButton setDigit:'#'];
[addressField setAdjustsFontSizeToFitWidth:TRUE]; // Not put it in IB: issue with placeholder size
[_addressField setAdjustsFontSizeToFitWidth:TRUE]; // Not put it in IB: issue with placeholder size
UILongPressGestureRecognizer *backspaceLongGesture =
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onBackspaceLongClick:)];
[backspaceButton addGestureRecognizer:backspaceLongGesture];
[_backspaceButton addGestureRecognizer:backspaceLongGesture];
UILongPressGestureRecognizer *zeroLongGesture =
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onZeroLongClick:)];
[zeroButton addGestureRecognizer:zeroLongGesture];
[_zeroButton addGestureRecognizer:zeroLongGesture];
UILongPressGestureRecognizer *oneLongGesture =
[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onOneLongClick:)];
[oneButton addGestureRecognizer:oneLongGesture];
[_oneButton addGestureRecognizer:oneLongGesture];
if (IPAD) {
if (LinphoneManager.instance.frontCamId != nil) {
// only show camera switch button if we have more than 1 camera
[videoCameraSwitch setHidden:FALSE];
[_videoCameraSwitch setHidden:FALSE];
}
}
}
@ -194,23 +145,23 @@ static UICompositeViewDescription *compositeDescription = nil;
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
switch (toInterfaceOrientation) {
case UIInterfaceOrientationPortrait:
[videoPreview setTransform:CGAffineTransformMakeRotation(0)];
[_videoPreview setTransform:CGAffineTransformMakeRotation(0)];
break;
case UIInterfaceOrientationPortraitUpsideDown:
[videoPreview setTransform:CGAffineTransformMakeRotation(M_PI)];
[_videoPreview setTransform:CGAffineTransformMakeRotation(M_PI)];
break;
case UIInterfaceOrientationLandscapeLeft:
[videoPreview setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
[_videoPreview setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
break;
case UIInterfaceOrientationLandscapeRight:
[videoPreview setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];
[_videoPreview setTransform:CGAffineTransformMakeRotation(-M_PI / 2)];
break;
default:
break;
}
CGRect frame = self.view.frame;
frame.origin = CGPointMake(0, 0);
videoPreview.frame = frame;
_videoPreview.frame = frame;
_padView.hidden = !IPAD && UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}
@ -224,15 +175,14 @@ static UICompositeViewDescription *compositeDescription = nil;
- (void)coreUpdateEvent:(NSNotification *)notif {
if (IPAD) {
LinphoneCore *lc = LC;
if (linphone_core_video_display_enabled(lc) && linphone_core_video_preview_enabled(lc)) {
linphone_core_set_native_preview_window_id(lc, (__bridge void *)(videoPreview));
[backgroundView setHidden:FALSE];
[videoCameraSwitch setHidden:FALSE];
if (linphone_core_video_display_enabled(LC) && linphone_core_video_preview_enabled(LC)) {
linphone_core_set_native_preview_window_id(LC, (__bridge void *)(_videoPreview));
[_backgroundView setHidden:FALSE];
[_videoCameraSwitch setHidden:FALSE];
} else {
linphone_core_set_native_preview_window_id(lc, NULL);
[backgroundView setHidden:TRUE];
[videoCameraSwitch setHidden:TRUE];
linphone_core_set_native_preview_window_id(LC, NULL);
[_backgroundView setHidden:TRUE];
[_videoCameraSwitch setHidden:TRUE];
}
}
}
@ -309,14 +259,33 @@ static UICompositeViewDescription *compositeDescription = nil;
[self presentMailViewWithTitle:appName forRecipients:@[ logsAddress ] attachLogs:true];
}];
BOOL debugEnabled = [LinphoneManager.instance lpConfigBoolForKey:@"debugenable_preference"];
int debugLevel = [LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"];
BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR);
NSString *actionLog =
(debugEnabled ? NSLocalizedString(@"Disable logs", nil) : NSLocalizedString(@"Enable logs", nil));
[alertView addButtonWithTitle:actionLog
[alertView
addButtonWithTitle:actionLog
block:^{
int newDebugLevel = debugEnabled ? ORTP_ERROR : ORTP_DEBUG;
[LinphoneManager.instance lpConfigSetInt:newDebugLevel forKey:@"debugenable_preference"];
[Log enableLogs:newDebugLevel];
}];
[alertView addButtonWithTitle:NSLocalizedString(@"Remove account(s) and self destruct", nil)
block:^{
BOOL enabled = !debugEnabled;
[LinphoneManager.instance lpConfigSetBool:enabled forKey:@"debugenable_preference"];
[Log enableLogs:enabled];
linphone_core_clear_proxy_config([LinphoneManager getLc]);
linphone_core_clear_all_auth_info([LinphoneManager getLc]);
[LinphoneManager.instance destroyLinphoneCore];
if ([NSFileManager.defaultManager
isDeletableFileAtPath:[LinphoneManager documentFile:@"linphonerc"]] == YES) {
[NSFileManager.defaultManager
removeItemAtPath:[LinphoneManager documentFile:@"linphonerc"]
error:nil];
}
#ifdef DEBUG
[LinphoneManager instanceRelease];
#endif
[UIApplication sharedApplication].keyWindow.rootViewController = nil;
}];
[alertView show];
@ -328,24 +297,14 @@ static UICompositeViewDescription *compositeDescription = nil;
#pragma mark -
- (void)callUpdate:(LinphoneCall *)call state:(LinphoneCallState)state {
LinphoneCore *lc = LC;
BOOL callInProgress = (linphone_core_get_calls_nb(lc) > 0);
addCallButton.hidden = (!callInProgress || transferMode);
transferButton.hidden = (!callInProgress || !transferMode);
addContactButton.hidden = callButton.hidden = callInProgress;
backButton.hidden = !callInProgress;
[callButton updateVideoPolicy];
BOOL callInProgress = (linphone_core_get_calls_nb(LC) > 0);
_addContactButton.hidden = callInProgress;
_backButton.hidden = !callInProgress;
[_callButton updateIcon];
}
- (void)setAddress:(NSString *)address {
[addressField setText:address];
}
- (void)setTransferMode:(BOOL)atransferMode {
transferMode = atransferMode;
LinphoneCall *call = linphone_core_get_current_call(LC);
LinphoneCallState state = (call != NULL) ? linphone_call_get_state(call) : 0;
[self callUpdate:call state:state];
[_addressField setText:address];
}
#pragma mark - UITextFieldDelegate Functions
@ -358,12 +317,12 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField == addressField) {
[addressField resignFirstResponder];
if (textField == _addressField) {
[_addressField resignFirstResponder];
}
if (textField.text.length > 0) {
LinphoneAddress *addr = linphone_core_interpret_url(LC, textField.text.UTF8String);
[LinphoneManager.instance call:addr transfer:FALSE];
[LinphoneManager.instance call:addr];
if (addr)
linphone_address_destroy(addr);
}
@ -385,7 +344,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (IBAction)onAddContactClick:(id)event {
[ContactSelection setSelectionMode:ContactSelectionModeEdit];
[ContactSelection setAddAddress:[addressField text]];
[ContactSelection setAddAddress:[_addressField text]];
[ContactSelection setSipFilter:nil];
[ContactSelection setNameOrEmailFilter:nil];
[ContactSelection enableEmailFilter:FALSE];
@ -397,28 +356,28 @@ static UICompositeViewDescription *compositeDescription = nil;
}
- (IBAction)onAddressChange:(id)sender {
if ([self displayDebugPopup:self.addressField.text]) {
self.addressField.text = @"";
if ([self displayDebugPopup:_addressField.text]) {
_addressField.text = @"";
}
addContactButton.enabled = backspaceButton.enabled = addCallButton.enabled = transferButton.enabled =
([[addressField text] length] > 0);
_addContactButton.enabled = _backspaceButton.enabled = ([[_addressField text] length] > 0);
}
- (IBAction)onBackspaceClick:(id)sender {
if ([addressField.text length] > 0) {
[addressField setText:[addressField.text substringToIndex:[addressField.text length] - 1]];
if ([_addressField.text length] > 0) {
[_addressField setText:[_addressField.text substringToIndex:[_addressField.text length] - 1]];
}
}
- (void)onBackspaceLongClick:(id)sender {
[addressField setText:@""];
[_addressField setText:@""];
}
- (void)onZeroLongClick:(id)sender {
// replace last character with a '+'
NSString *newAddress =
[[self.addressField.text substringToIndex:[self.addressField.text length] - 1] stringByAppendingString:@"+"];
[self.addressField setText:newAddress];
[[_addressField.text substringToIndex:[_addressField.text length] - 1] stringByAppendingString:@"+"];
[_addressField setText:newAddress];
linphone_core_stop_dtmf(LC);
}
- (void)onOneLongClick:(id)sender {
@ -427,10 +386,11 @@ static UICompositeViewDescription *compositeDescription = nil;
LinphoneAddress *addr = linphone_core_interpret_url(LC, voiceMail ? voiceMail.UTF8String : NULL);
if (addr) {
linphone_address_set_display_name(addr, NSLocalizedString(@"Voice mail", nil).UTF8String);
[lm call:addr transfer:FALSE];
[lm call:addr];
linphone_address_destroy(addr);
} else {
LOGE(@"Cannot call voice mail because URI not set or invalid!");
}
linphone_core_stop_dtmf(LC);
}
@end

View file

@ -166,7 +166,7 @@ static UICompositeViewDescription *compositeDescription = nil;
- (IBAction)onCallClick:(id)event {
LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog);
[LinphoneManager.instance call:addr transfer:NO];
[LinphoneManager.instance call:addr];
}
- (IBAction)onChatClick:(id)event {

View file

@ -228,7 +228,7 @@
[cell onDetails:self];
} else {
LinphoneAddress *addr = linphone_call_log_get_remote_address(callLog);
[LinphoneManager.instance call:addr transfer:NO];
[LinphoneManager.instance call:addr];
}
}
}

@ -1 +1 @@
Subproject commit c01c063616dbdab05bea25eb94c7643a52f2b7dc
Subproject commit 2e2e314a44aa9e3949fd54c75baff376af526493

80
Classes/LaunchScreen.xib Normal file
View file

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" launchScreen="YES">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="iN0-l3-epB">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="color_C.png" id="xtr-QP-6We" userLabel="backgroundColor">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="0.0" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</imageView>
<view contentMode="scaleAspectFit" id="4JK-Mw-ZzG">
<rect key="frame" x="87" y="191" width="200" height="285"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleAspectFit" image="splashscreen.png" id="pz0-nR-x0f" userLabel="logoImage">
<rect key="frame" x="0.0" y="0.0" width="200" height="169"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" heightSizable="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.10000000000000001" id="Koq-w1-U9D" userLabel="descLabel">
<rect key="frame" x="0.0" y="251" width="200" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<attributedString key="attributedText">
<fragment content="The ">
<attributes>
<color key="NSColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<font key="NSFont" size="26" name="HelveticaNeue"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="truncatingTail" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="libre">
<attributes>
<color key="NSColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<font key="NSFont" size="26" name="HelveticaNeue-Italic"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="truncatingTail" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content=" SIP client">
<attributes>
<color key="NSColor" red="1" green="0.36862745099999999" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<font key="NSFont" size="26" name="HelveticaNeue"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="truncatingTail" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
</attributedString>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="LINPHONE" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.10000000000000001" id="u44-hJ-SgI" userLabel="nameLabel">
<rect key="frame" x="0.0" y="196" width="200" height="47"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="41"/>
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</view>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="color_A.png" id="P8D-kY-xHP" userLabel="bottomBarImage">
<rect key="frame" x="127" y="656" width="119" height="11"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
</imageView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<nil key="simulatedStatusBarMetrics"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<point key="canvasLocation" x="238.5" y="1005.5"/>
</view>
</objects>
<resources>
<image name="color_A.png" width="2" height="2"/>
<image name="color_C.png" width="2" height="2"/>
<image name="splashscreen.png" width="181" height="165"/>
</resources>
</document>

View file

@ -30,6 +30,7 @@
}
- (void)processRemoteNotification:(NSDictionary*)userInfo;
- (void)registerForNotifications:(UIApplication *)app;
@property (nonatomic, retain) UIAlertView *waitingIndicator;
@property (nonatomic, retain) NSString *configURL;

View file

@ -53,8 +53,7 @@
- (void)applicationWillResignActive:(UIApplication *)application {
LOGI(@"%@", NSStringFromSelector(_cmd));
LinphoneCore *lc = LC;
LinphoneCall *call = linphone_core_get_current_call(lc);
LinphoneCall *call = linphone_core_get_current_call(LC);
if (call) {
/* save call context */
@ -84,8 +83,7 @@
[instance becomeActive];
LinphoneCore *lc = LC;
LinphoneCall *call = linphone_core_get_current_call(lc);
LinphoneCall *call = linphone_core_get_current_call(LC);
if (call) {
if (call == instance->currentCallContextBeforeGoingBackground.call) {
@ -104,27 +102,44 @@
}
- (UIUserNotificationCategory *)getMessageNotificationCategory {
NSArray *actions;
UIMutableUserNotificationAction *reply = [[UIMutableUserNotificationAction alloc] init];
reply.identifier = @"reply";
reply.title = NSLocalizedString(@"Reply", nil);
reply.activationMode = UIUserNotificationActivationModeForeground;
reply.destructive = NO;
reply.authenticationRequired = YES;
if ([[UIDevice.currentDevice systemVersion] floatValue] < 9 ||
[LinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif"] == NO) {
UIMutableUserNotificationAction *mark_read = [[UIMutableUserNotificationAction alloc] init];
mark_read.identifier = @"mark_read";
mark_read.title = NSLocalizedString(@"Mark Read", nil);
mark_read.activationMode = UIUserNotificationActivationModeBackground;
mark_read.destructive = NO;
mark_read.authenticationRequired = NO;
UIMutableUserNotificationAction *reply = [[UIMutableUserNotificationAction alloc] init];
reply.identifier = @"reply";
reply.title = NSLocalizedString(@"Reply", nil);
reply.activationMode = UIUserNotificationActivationModeForeground;
reply.destructive = NO;
reply.authenticationRequired = YES;
NSArray *localRingActions = @[ mark_read, reply ];
UIMutableUserNotificationAction *mark_read = [[UIMutableUserNotificationAction alloc] init];
mark_read.identifier = @"mark_read";
mark_read.title = NSLocalizedString(@"Mark Read", nil);
mark_read.activationMode = UIUserNotificationActivationModeBackground;
mark_read.destructive = NO;
mark_read.authenticationRequired = NO;
actions = @[ mark_read, reply ];
} else {
// iOS 9 allows for inline reply. We don't propose mark_read in this case
UIMutableUserNotificationAction *reply_inline = [[UIMutableUserNotificationAction alloc] init];
reply_inline.identifier = @"reply_inline";
reply_inline.title = NSLocalizedString(@"Reply", nil);
reply_inline.activationMode = UIUserNotificationActivationModeBackground;
reply_inline.destructive = NO;
reply_inline.authenticationRequired = NO;
reply_inline.behavior = UIUserNotificationActionBehaviorTextInput;
actions = @[ reply_inline ];
}
UIMutableUserNotificationCategory *localRingNotifAction = [[UIMutableUserNotificationCategory alloc] init];
localRingNotifAction.identifier = @"incoming_msg";
[localRingNotifAction setActions:localRingActions forContext:UIUserNotificationActionContextDefault];
[localRingNotifAction setActions:localRingActions forContext:UIUserNotificationActionContextMinimal];
[localRingNotifAction setActions:actions forContext:UIUserNotificationActionContextDefault];
[localRingNotifAction setActions:actions forContext:UIUserNotificationActionContextMinimal];
return localRingNotifAction;
}
@ -154,14 +169,8 @@
return localRingNotifAction;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplication *app = [UIApplication sharedApplication];
UIApplicationState state = app.applicationState;
LinphoneManager *instance = LinphoneManager.instance;
BOOL background_mode = [instance lpConfigBoolForKey:@"backgroundmode_preference"];
BOOL start_at_boot = [instance lpConfigBoolForKey:@"start_at_boot_preference"];
- (void)registerForNotifications:(UIApplication *)app {
LinphoneManager *instance = [LinphoneManager instance];
if ([app respondsToSelector:@selector(registerUserNotificationSettings:)]) {
/* iOS8 notifications can be actioned! Awesome: */
@ -178,12 +187,25 @@
[app registerForRemoteNotifications];
}
} else {
/* iOS7 and below */
if (!instance.isTesting) {
NSUInteger notifTypes =
UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
[app registerForRemoteNotificationTypes:notifTypes];
}
}
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplication *app = [UIApplication sharedApplication];
UIApplicationState state = app.applicationState;
LinphoneManager *instance = [LinphoneManager instance];
BOOL background_mode = [instance lpConfigBoolForKey:@"backgroundmode_preference"];
BOOL start_at_boot = [instance lpConfigBoolForKey:@"start_at_boot_preference"];
[self registerForNotifications:app];
if (state == UIApplicationStateBackground) {
// we've been woken up directly to background;
@ -276,9 +298,8 @@
NSString *loc_key = [alert objectForKey:@"loc-key"];
/*if we receive a remote notification, it is probably because our TCP background socket was no more working.
As a result, break it and refresh registers in order to make sure to receive incoming INVITE or MESSAGE*/
LinphoneCore *lc = LC;
if (linphone_core_get_calls(lc) == NULL) { // if there are calls, obviously our TCP socket shall be working
linphone_core_set_network_reachable(lc, FALSE);
if (linphone_core_get_calls(LC) == NULL) { // if there are calls, obviously our TCP socket shall be working
linphone_core_set_network_reachable(LC, FALSE);
LinphoneManager.instance.connectivity = none; /*force connectivity to be discovered again*/
[LinphoneManager.instance refreshRegisters];
if (loc_key != nil) {
@ -369,12 +390,11 @@
userInfo:nil
repeats:FALSE];
LinphoneCore *lc = LC;
// If no call is yet received at this time, then force Linphone to drop the current socket and make new one to
// register, so that we get
// a better chance to receive the INVITE.
if (linphone_core_get_calls(lc) == NULL) {
linphone_core_set_network_reachable(lc, FALSE);
if (linphone_core_get_calls(LC) == NULL) {
linphone_core_set_network_reachable(LC, FALSE);
lm.connectivity = none; /*force connectivity to be discovered again*/
[lm refreshRegisters];
}
@ -406,17 +426,15 @@
completionHandler:(void (^)())completionHandler {
LOGI(@"%@", NSStringFromSelector(_cmd));
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
LinphoneCore *lc = LC;
LOGI(@"%@", NSStringFromSelector(_cmd));
if ([notification.category isEqualToString:@"incoming_call"]) {
if ([identifier isEqualToString:@"answer"]) {
// use the standard handler
[self application:application didReceiveLocalNotification:notification];
} else if ([identifier isEqualToString:@"decline"]) {
LinphoneCall *call = linphone_core_get_current_call(lc);
LinphoneCall *call = linphone_core_get_current_call(LC);
if (call)
linphone_core_decline_call(lc, call, LinphoneReasonDeclined);
linphone_core_decline_call(LC, call, LinphoneReasonDeclined);
}
} else if ([notification.category isEqualToString:@"incoming_msg"]) {
if ([identifier isEqualToString:@"reply"]) {
@ -424,7 +442,7 @@
[self application:application didReceiveLocalNotification:notification];
} else if ([identifier isEqualToString:@"mark_read"]) {
NSString *from = [notification.userInfo objectForKey:@"from_addr"];
LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(lc, [from UTF8String]);
LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(LC, [from UTF8String]);
if (room) {
linphone_chat_room_mark_as_read(room);
TabBarView *tab = (TabBarView *)[PhoneMainView.instance.mainViewController
@ -438,6 +456,25 @@
completionHandler();
}
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forLocalNotification:(UILocalNotification *)notification
withResponseInfo:(NSDictionary *)responseInfo
completionHandler:(void (^)())completionHandler {
if ([notification.category isEqualToString:@"incoming_msg"] && [identifier isEqualToString:@"reply_inline"]) {
LinphoneCore *lc = [LinphoneManager getLc];
NSString *replyText = [responseInfo objectForKey:UIUserNotificationActionResponseTypedTextKey];
NSString *from = [notification.userInfo objectForKey:@"from_addr"];
LinphoneChatRoom *room = linphone_core_get_chat_room_from_uri(lc, [from UTF8String]);
if (room) {
LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String);
linphone_chat_room_send_chat_message(room, msg);
linphone_chat_room_mark_as_read(room);
}
}
}
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo

View file

@ -99,14 +99,13 @@
}
- (void)transformCodecsToKeys:(const MSList *)codecs {
LinphoneCore *lc = LC;
const MSList *elem = codecs;
for (; elem != NULL; elem = elem->next) {
PayloadType *pt = (PayloadType *)elem->data;
NSString *pref = [LinphoneManager getPreferenceForCodec:pt->mime_type withRate:pt->clock_rate];
if (pref) {
bool_t value = linphone_core_payload_type_enabled(lc, pt);
bool_t value = linphone_core_payload_type_enabled(LC, pt);
[self setBool:value forKey:pref];
} else {
LOGW(@"Codec %s/%i supported by core is not shown in iOS app config view.", pt->mime_type, pt->clock_rate);
@ -115,8 +114,7 @@
}
- (void)transformAccountToKeys:(NSString *)username {
LinphoneCore *lc = LC;
const MSList *proxies = linphone_core_get_proxy_config_list(lc);
const MSList *proxies = linphone_core_get_proxy_config_list(LC);
while (username && proxies &&
strcmp(username.UTF8String,
linphone_address_get_username(linphone_proxy_config_get_identity_address(proxies->data))) != 0) {
@ -187,11 +185,11 @@
[self setBool:(linphone_proxy_config_get_route(proxy) != NULL) forKey:@"account_outbound_proxy_preference"];
[self setBool:linphone_proxy_config_avpf_enabled(proxy) forKey:@"account_avpf_preference"];
[self setBool:linphone_proxy_config_register_enabled(proxy) forKey:@"account_is_enabled_preference"];
[self setBool:(linphone_core_get_default_proxy_config(lc) == proxy)
[self setBool:(linphone_core_get_default_proxy_config(LC) == proxy)
forKey:@"account_is_default_preference"];
const LinphoneAuthInfo *ai = linphone_core_find_auth_info(
lc, NULL, [self stringForKey:@"account_mandatory_username_preference"].UTF8String,
LC, NULL, [self stringForKey:@"account_mandatory_username_preference"].UTF8String,
[self stringForKey:@"account_mandatory_domain_preference"].UTF8String);
if (ai) {
[self setCString:linphone_auth_info_get_userid(ai) forKey:@"account_userid_preference"];
@ -200,7 +198,7 @@
[self setCString:linphone_auth_info_get_ha1(ai) forKey:@"ha1_preference"];
}
int idx = ms_list_index(linphone_core_get_proxy_config_list(lc), proxy);
int idx = ms_list_index(linphone_core_get_proxy_config_list(LC), proxy);
[self setInteger:idx forKey:@"current_proxy_config_preference"];
int expires = linphone_proxy_config_get_expires(proxy);
@ -219,7 +217,6 @@
- (void)transformLinphoneCoreToKeys {
LinphoneManager *lm = LinphoneManager.instance;
LinphoneCore *lc = LC;
// root section
{
@ -232,7 +229,7 @@
forKey:key];
}
[self setBool:linphone_core_video_display_enabled(lc) forKey:@"enable_video_preference"];
[self setBool:linphone_core_video_display_enabled(LC) forKey:@"enable_video_preference"];
[self setBool:[LinphoneManager.instance lpConfigBoolForKey:@"auto_answer"]
forKey:@"enable_auto_answer_preference"];
[self setBool:[lm lpConfigBoolForKey:@"account_mandatory_advanced_preference"]
@ -244,9 +241,9 @@
// audio section
{
[self transformCodecsToKeys:linphone_core_get_audio_codecs(lc)];
[self setFloat:linphone_core_get_playback_gain_db(lc) forKey:@"playback_gain_preference"];
[self setFloat:linphone_core_get_mic_gain_db(lc) forKey:@"microphone_gain_preference"];
[self transformCodecsToKeys:linphone_core_get_audio_codecs(LC)];
[self setFloat:linphone_core_get_playback_gain_db(LC) forKey:@"playback_gain_preference"];
[self setFloat:linphone_core_get_mic_gain_db(LC) forKey:@"microphone_gain_preference"];
[self setInteger:[lm lpConfigIntForKey:@"codec_bitrate_limit"
inSection:@"audio"
withDefault:kLinphoneAudioVbrCodecDefaultBitrate]
@ -257,19 +254,19 @@
// video section
{
[self transformCodecsToKeys:linphone_core_get_video_codecs(lc)];
[self transformCodecsToKeys:linphone_core_get_video_codecs(LC)];
const LinphoneVideoPolicy *pol;
pol = linphone_core_get_video_policy(lc);
pol = linphone_core_get_video_policy(LC);
[self setBool:(pol->automatically_initiate) forKey:@"start_video_preference"];
[self setBool:(pol->automatically_accept) forKey:@"accept_video_preference"];
[self setBool:linphone_core_self_view_enabled(lc) forKey:@"self_video_preference"];
[self setBool:linphone_core_self_view_enabled(LC) forKey:@"self_video_preference"];
BOOL previewEnabled = [lm lpConfigBoolForKey:@"preview_preference" withDefault:YES];
[self setBool:IPAD && previewEnabled forKey:@"preview_preference"];
const char *preset = linphone_core_get_video_preset(lc);
const char *preset = linphone_core_get_video_preset(LC);
[self setCString:preset ? preset : "default" forKey:@"video_preset_preference"];
MSVideoSize vsize = linphone_core_get_preferred_video_size(lc);
MSVideoSize vsize = linphone_core_get_preferred_video_size(LC);
int index;
if ((vsize.width == MS_VIDEO_SIZE_720P_W) && (vsize.height == MS_VIDEO_SIZE_720P_H)) {
index = 0;
@ -279,17 +276,17 @@
index = 2;
}
[self setInteger:index forKey:@"video_preferred_size_preference"];
[self setInteger:linphone_core_get_preferred_framerate(lc) forKey:@"video_preferred_fps_preference"];
[self setInteger:linphone_core_get_download_bandwidth(lc) forKey:@"download_bandwidth_preference"];
[self setInteger:linphone_core_get_preferred_framerate(LC) forKey:@"video_preferred_fps_preference"];
[self setInteger:linphone_core_get_download_bandwidth(LC) forKey:@"download_bandwidth_preference"];
}
// call section
{
[self setBool:linphone_core_get_use_info_for_dtmf(lc) forKey:@"sipinfo_dtmf_preference"];
[self setBool:linphone_core_get_use_rfc2833_for_dtmf(lc) forKey:@"rfc_dtmf_preference"];
[self setBool:linphone_core_get_use_info_for_dtmf(LC) forKey:@"sipinfo_dtmf_preference"];
[self setBool:linphone_core_get_use_rfc2833_for_dtmf(LC) forKey:@"rfc_dtmf_preference"];
[self setInteger:linphone_core_get_inc_timeout(lc) forKey:@"incoming_call_timeout_preference"];
[self setInteger:linphone_core_get_in_call_timeout(lc) forKey:@"in_call_timeout_preference"];
[self setInteger:linphone_core_get_inc_timeout(LC) forKey:@"incoming_call_timeout_preference"];
[self setInteger:linphone_core_get_in_call_timeout(LC) forKey:@"in_call_timeout_preference"];
[self setBool:[lm lpConfigBoolForKey:@"repeat_call_notification"]
forKey:@"repeat_call_notification_preference"];
@ -299,15 +296,15 @@
{
[self setBool:[lm lpConfigBoolForKey:@"edge_opt_preference" withDefault:NO] forKey:@"edge_opt_preference"];
[self setBool:[lm lpConfigBoolForKey:@"wifi_only_preference" withDefault:NO] forKey:@"wifi_only_preference"];
[self setCString:linphone_core_get_stun_server(lc) forKey:@"stun_preference"];
[self setBool:linphone_core_get_firewall_policy(lc) == LinphonePolicyUseIce forKey:@"ice_preference"];
[self setCString:linphone_core_get_stun_server(LC) forKey:@"stun_preference"];
[self setBool:linphone_core_get_firewall_policy(LC) == LinphonePolicyUseIce forKey:@"ice_preference"];
int random_port_preference = [lm lpConfigIntForKey:@"random_port_preference" withDefault:1];
[self setInteger:random_port_preference forKey:@"random_port_preference"];
int port = [lm lpConfigIntForKey:@"port_preference" withDefault:5060];
[self setInteger:port forKey:@"port_preference"];
{
int minPort, maxPort;
linphone_core_get_audio_port_range(lc, &minPort, &maxPort);
linphone_core_get_audio_port_range(LC, &minPort, &maxPort);
if (minPort != maxPort)
[self setObject:[NSString stringWithFormat:@"%d-%d", minPort, maxPort] forKey:@"audio_port_preference"];
else
@ -315,14 +312,14 @@
}
{
int minPort, maxPort;
linphone_core_get_video_port_range(lc, &minPort, &maxPort);
linphone_core_get_video_port_range(LC, &minPort, &maxPort);
if (minPort != maxPort)
[self setObject:[NSString stringWithFormat:@"%d-%d", minPort, maxPort] forKey:@"video_port_preference"];
else
[self setObject:[NSString stringWithFormat:@"%d", minPort] forKey:@"video_port_preference"];
}
[self setBool:[lm lpConfigBoolForKey:@"use_ipv6" withDefault:NO] forKey:@"use_ipv6"];
LinphoneMediaEncryption menc = linphone_core_get_media_encryption(lc);
LinphoneMediaEncryption menc = linphone_core_get_media_encryption(LC);
const char *val;
switch (menc) {
case LinphoneMediaEncryptionSRTP:
@ -341,9 +338,9 @@
[self setCString:val forKey:@"media_encryption_preference"];
[self setBool:[lm lpConfigBoolForKey:@"pushnotification_preference" withDefault:NO]
forKey:@"pushnotification_preference"];
[self setInteger:linphone_core_get_upload_bandwidth(lc) forKey:@"upload_bandwidth_preference"];
[self setInteger:linphone_core_get_download_bandwidth(lc) forKey:@"download_bandwidth_preference"];
[self setBool:linphone_core_adaptive_rate_control_enabled(lc) forKey:@"adaptive_rate_control_preference"];
[self setInteger:linphone_core_get_upload_bandwidth(LC) forKey:@"upload_bandwidth_preference"];
[self setInteger:linphone_core_get_download_bandwidth(LC) forKey:@"download_bandwidth_preference"];
[self setBool:linphone_core_adaptive_rate_control_enabled(LC) forKey:@"adaptive_rate_control_preference"];
}
// tunnel section
@ -364,7 +361,7 @@
// advanced section
{
[self setBool:[lm lpConfigBoolForKey:@"debugenable_preference"] forKey:@"debugenable_preference"];
[self setObject:[lm lpConfigStringForKey:@"debugenable_preference"] forKey:@"debugenable_preference"];
[self setBool:ANIMATED forKey:@"animations_preference"];
[self setBool:[lm lpConfigBoolForKey:@"backgroundmode_preference"] forKey:@"backgroundmode_preference"];
[self setBool:[lm lpConfigBoolForKey:@"start_at_boot_preference"] forKey:@"start_at_boot_preference"];
@ -372,13 +369,13 @@
[self setBool:[lm lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES] forKey:@"show_msg_in_notif"];
[self setBool:[lm lpConfigBoolForKey:@"enable_first_login_view_preference"]
forKey:@"enable_first_login_view_preference"];
LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(lc);
LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(LC);
if (parsed != NULL) {
[self setCString:linphone_address_get_display_name(parsed) forKey:@"primary_displayname_preference"];
[self setCString:linphone_address_get_username(parsed) forKey:@"primary_username_preference"];
}
linphone_address_destroy(parsed);
[self setCString:linphone_core_get_file_transfer_server(lc) forKey:@"file_transfer_server_url_preference"];
[self setCString:linphone_core_get_file_transfer_server(LC) forKey:@"file_transfer_server_url_preference"];
}
changedDict = [[NSMutableDictionary alloc] init];
@ -400,7 +397,6 @@
- (void)synchronizeAccounts {
LOGI(@"Account changed, synchronizing.");
LinphoneManager *lm = LinphoneManager.instance;
LinphoneCore *lc = LC;
LinphoneProxyConfig *proxyCfg = NULL;
NSString *error = nil;
@ -415,18 +411,18 @@
LCSipTransports transportValue = {port_preference, port_preference, -1, -1};
// will also update the sip_*_port section of the config
if (linphone_core_set_sip_transports(lc, &transportValue)) {
if (linphone_core_set_sip_transports(LC, &transportValue)) {
LOGE(@"cannot set transport");
}
port_preference = linphone_core_get_sip_port(lc);
port_preference = linphone_core_get_sip_port(LC);
[self setInteger:port_preference forKey:@"port_preference"]; // Update back preference
BOOL enable_ipv6 = [self boolForKey:@"use_ipv6"];
[lm lpConfigSetBool:enable_ipv6 forKey:@"use_ipv6" inSection:@"sip"];
if (linphone_core_ipv6_enabled(lc) != enable_ipv6) {
if (linphone_core_ipv6_enabled(LC) != enable_ipv6) {
LOGD(@"%@ IPV6", enable_ipv6 ? @"ENABLING" : @"DISABLING");
linphone_core_enable_ipv6(lc, enable_ipv6);
linphone_core_enable_ipv6(LC, enable_ipv6);
}
// configure sip account
@ -482,7 +478,7 @@
char normalizedUserName[256];
LinphoneAddress *linphoneAddress = linphone_core_interpret_url(LC, "sip:user@domain.com");
proxyCfg = ms_list_nth_data(linphone_core_get_proxy_config_list(lc),
proxyCfg = ms_list_nth_data(linphone_core_get_proxy_config_list(LC),
[self integerForKey:@"current_proxy_config_preference"]);
// if account was deleted, it is not present anymore
if (proxyCfg == NULL) {
@ -494,7 +490,7 @@
linphone_address_set_username(linphoneAddress, normalizedUserName);
linphone_address_set_domain(linphoneAddress, [domain UTF8String]);
linphone_address_set_display_name(linphoneAddress, (displayName.length ? displayName.UTF8String : NULL));
const char *identity = linphone_address_as_string_uri_only(linphoneAddress);
const char *identity = linphone_address_as_string(linphoneAddress);
const char *password = [accountPassword UTF8String];
const char *ha1 = [accountHa1 UTF8String];
@ -529,9 +525,9 @@
linphone_proxy_config_enable_avpf(proxyCfg, use_avpf);
linphone_proxy_config_set_expires(proxyCfg, expire);
if (is_default) {
linphone_core_set_default_proxy_config(lc, proxyCfg);
} else if (linphone_core_get_default_proxy_config(lc) == proxyCfg) {
linphone_core_set_default_proxy_config(lc, NULL);
linphone_core_set_default_proxy_config(LC, proxyCfg);
} else if (linphone_core_get_default_proxy_config(LC) == proxyCfg) {
linphone_core_set_default_proxy_config(LC, NULL);
}
LinphoneAuthInfo *proxyAi = (LinphoneAuthInfo *)linphone_proxy_config_find_auth_info(proxyCfg);
@ -542,7 +538,7 @@
// modify auth info only after finishing editting the proxy config, so that
// UNREGISTER succeed
if (proxyAi) {
linphone_core_remove_auth_info(lc, proxyAi);
linphone_core_remove_auth_info(LC, proxyAi);
}
LinphoneAddress *from = linphone_core_interpret_url(LC, identity);
if (from) {
@ -551,7 +547,7 @@
linphone_address_get_username(from), userid_str, password ? password : NULL, password ? NULL : ha1,
linphone_proxy_config_get_realm(proxyCfg), linphone_proxy_config_get_domain(proxyCfg));
linphone_address_destroy(from);
linphone_core_add_auth_info(lc, info);
linphone_core_add_auth_info(LC, info);
linphone_auth_info_destroy(info);
}
@ -577,20 +573,18 @@
}
- (void)synchronizeCodecs:(const MSList *)codecs {
LinphoneCore *lc = LC;
PayloadType *pt;
const MSList *elem;
for (elem = codecs; elem != NULL; elem = elem->next) {
pt = (PayloadType *)elem->data;
NSString *pref = [LinphoneManager getPreferenceForCodec:pt->mime_type withRate:pt->clock_rate];
linphone_core_enable_payload_type(lc, pt, [self boolForKey:pref]);
linphone_core_enable_payload_type(LC, pt, [self boolForKey:pref]);
}
}
- (BOOL)synchronize {
LinphoneManager *lm = LinphoneManager.instance;
LinphoneCore *lc = LC;
// root section
{
BOOL account_changed = NO;
@ -609,8 +603,8 @@
[self synchronizeAccounts];
bool enableVideo = [self boolForKey:@"enable_video_preference"];
linphone_core_enable_video_capture(lc, enableVideo);
linphone_core_enable_video_display(lc, enableVideo);
linphone_core_enable_video_capture(LC, enableVideo);
linphone_core_enable_video_display(LC, enableVideo);
bool enableAutoAnswer = [self boolForKey:@"enable_auto_answer_preference"];
[LinphoneManager.instance lpConfigSetBool:enableAutoAnswer forKey:@"auto_answer"];
@ -618,13 +612,13 @@
// audio section
{
[self synchronizeCodecs:linphone_core_get_audio_codecs(lc)];
[self synchronizeCodecs:linphone_core_get_audio_codecs(LC)];
float playback_gain = [self floatForKey:@"playback_gain_preference"];
linphone_core_set_playback_gain_db(lc, playback_gain);
linphone_core_set_playback_gain_db(LC, playback_gain);
float mic_gain = [self floatForKey:@"microphone_gain_preference"];
linphone_core_set_mic_gain_db(lc, mic_gain);
linphone_core_set_mic_gain_db(LC, mic_gain);
[lm lpConfigSetInt:[self integerForKey:@"audio_codec_bitrate_limit_preference"]
forKey:@"codec_bitrate_limit"
@ -642,24 +636,24 @@
if (!voice_processing) {
au_device = @"AU: Audio Unit NoVoiceProc";
}
linphone_core_set_capture_device(lc, [au_device UTF8String]);
linphone_core_set_playback_device(lc, [au_device UTF8String]);
linphone_core_set_capture_device(LC, [au_device UTF8String]);
linphone_core_set_playback_device(LC, [au_device UTF8String]);
}
// video section
{
[self synchronizeCodecs:linphone_core_get_video_codecs(lc)];
[self synchronizeCodecs:linphone_core_get_video_codecs(LC)];
LinphoneVideoPolicy policy;
policy.automatically_initiate = [self boolForKey:@"start_video_preference"];
policy.automatically_accept = [self boolForKey:@"accept_video_preference"];
linphone_core_set_video_policy(lc, &policy);
linphone_core_enable_self_view(lc, [self boolForKey:@"self_video_preference"]);
linphone_core_set_video_policy(LC, &policy);
linphone_core_enable_self_view(LC, [self boolForKey:@"self_video_preference"]);
BOOL preview_preference = IPAD && [self boolForKey:@"preview_preference"];
[lm lpConfigSetInt:preview_preference forKey:@"preview_preference"];
NSString *videoPreset = [self stringForKey:@"video_preset_preference"];
linphone_core_set_video_preset(lc, [videoPreset UTF8String]);
linphone_core_set_video_preset(LC, [videoPreset UTF8String]);
int bw;
MSVideoSize vsize;
switch ([self integerForKey:@"video_preferred_size_preference"]) {
@ -680,22 +674,22 @@
bw = 380;
break;
}
linphone_core_set_preferred_video_size(lc, vsize);
linphone_core_set_preferred_video_size(LC, vsize);
if (![videoPreset isEqualToString:@"custom"]) {
[self setInteger:0 forKey:@"video_preferred_fps_preference"];
[self setInteger:bw forKey:@"download_bandwidth_preference"];
}
linphone_core_set_preferred_framerate(lc, [self integerForKey:@"video_preferred_fps_preference"]);
linphone_core_set_download_bandwidth(lc, [self integerForKey:@"download_bandwidth_preference"]);
linphone_core_set_upload_bandwidth(lc, [self integerForKey:@"download_bandwidth_preference"]);
linphone_core_set_preferred_framerate(LC, [self integerForKey:@"video_preferred_fps_preference"]);
linphone_core_set_download_bandwidth(LC, [self integerForKey:@"download_bandwidth_preference"]);
linphone_core_set_upload_bandwidth(LC, [self integerForKey:@"download_bandwidth_preference"]);
}
// call section
{
linphone_core_set_use_rfc2833_for_dtmf(lc, [self boolForKey:@"rfc_dtmf_preference"]);
linphone_core_set_use_info_for_dtmf(lc, [self boolForKey:@"sipinfo_dtmf_preference"]);
linphone_core_set_inc_timeout(lc, [self integerForKey:@"incoming_call_timeout_preference"]);
linphone_core_set_in_call_timeout(lc, [self integerForKey:@"in_call_timeout_preference"]);
linphone_core_set_use_rfc2833_for_dtmf(LC, [self boolForKey:@"rfc_dtmf_preference"]);
linphone_core_set_use_info_for_dtmf(LC, [self boolForKey:@"sipinfo_dtmf_preference"]);
linphone_core_set_inc_timeout(LC, [self integerForKey:@"incoming_call_timeout_preference"]);
linphone_core_set_in_call_timeout(LC, [self integerForKey:@"in_call_timeout_preference"]);
[lm lpConfigSetString:[self stringForKey:@"voice_mail_uri_preference"] forKey:@"voice_mail_uri"];
[lm lpConfigSetBool:[self boolForKey:@"repeat_call_notification_preference"]
forKey:@"repeat_call_notification"];
@ -714,42 +708,42 @@
NSString *stun_server = [self stringForKey:@"stun_preference"];
if ([stun_server length] > 0) {
linphone_core_set_stun_server(lc, [stun_server UTF8String]);
linphone_core_set_stun_server(LC, [stun_server UTF8String]);
BOOL ice_preference = [self boolForKey:@"ice_preference"];
if (ice_preference) {
linphone_core_set_firewall_policy(lc, LinphonePolicyUseIce);
linphone_core_set_firewall_policy(LC, LinphonePolicyUseIce);
} else {
linphone_core_set_firewall_policy(lc, LinphonePolicyUseStun);
linphone_core_set_firewall_policy(LC, LinphonePolicyUseStun);
}
} else {
linphone_core_set_stun_server(lc, NULL);
linphone_core_set_firewall_policy(lc, LinphonePolicyNoFirewall);
linphone_core_set_stun_server(LC, NULL);
linphone_core_set_firewall_policy(LC, LinphonePolicyNoFirewall);
}
{
NSString *audio_port_preference = [self stringForKey:@"audio_port_preference"];
int minPort, maxPort;
[LinphoneCoreSettingsStore parsePortRange:audio_port_preference minPort:&minPort maxPort:&maxPort];
linphone_core_set_audio_port_range(lc, minPort, maxPort);
linphone_core_set_audio_port_range(LC, minPort, maxPort);
}
{
NSString *video_port_preference = [self stringForKey:@"video_port_preference"];
int minPort, maxPort;
[LinphoneCoreSettingsStore parsePortRange:video_port_preference minPort:&minPort maxPort:&maxPort];
linphone_core_set_video_port_range(lc, minPort, maxPort);
linphone_core_set_video_port_range(LC, minPort, maxPort);
}
NSString *menc = [self stringForKey:@"media_encryption_preference"];
if (menc && [menc compare:@"SRTP"] == NSOrderedSame)
linphone_core_set_media_encryption(lc, LinphoneMediaEncryptionSRTP);
linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionSRTP);
else if (menc && [menc compare:@"ZRTP"] == NSOrderedSame)
linphone_core_set_media_encryption(lc, LinphoneMediaEncryptionZRTP);
linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionZRTP);
else if (menc && [menc compare:@"DTLS"] == NSOrderedSame)
linphone_core_set_media_encryption(lc, LinphoneMediaEncryptionDTLS);
linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionDTLS);
else
linphone_core_set_media_encryption(lc, LinphoneMediaEncryptionNone);
linphone_core_set_media_encryption(LC, LinphoneMediaEncryptionNone);
linphone_core_enable_adaptive_rate_control(lc, [self boolForKey:@"adaptive_rate_control_preference"]);
linphone_core_enable_adaptive_rate_control(LC, [self boolForKey:@"adaptive_rate_control_preference"]);
}
// tunnel section
@ -810,12 +804,12 @@
NSString *displayname = [self stringForKey:@"primary_displayname_preference"];
NSString *username = [self stringForKey:@"primary_username_preference"];
LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(lc);
LinphoneAddress *parsed = linphone_core_get_primary_contact_parsed(LC);
if (parsed != NULL) {
linphone_address_set_display_name(parsed, [displayname UTF8String]);
linphone_address_set_username(parsed, [username UTF8String]);
char *contact = linphone_address_as_string(parsed);
linphone_core_set_primary_contact(lc, contact);
linphone_core_set_primary_contact(LC, contact);
ms_free(contact);
linphone_address_destroy(parsed);
}
@ -823,7 +817,7 @@
[lm lpConfigSetInt:[self integerForKey:@"account_mandatory_advanced_preference"]
forKey:@"account_mandatory_advanced_preference"];
linphone_core_set_file_transfer_server(lc,
linphone_core_set_file_transfer_server(LC,
[[self stringForKey:@"file_transfer_server_url_preference"] UTF8String]);
}
@ -837,23 +831,22 @@
}
- (void)removeAccount {
LinphoneCore *lc = LC;
LinphoneProxyConfig *config = ms_list_nth_data(linphone_core_get_proxy_config_list(lc),
LinphoneProxyConfig *config = ms_list_nth_data(linphone_core_get_proxy_config_list(LC),
[self integerForKey:@"current_proxy_config_preference"]);
BOOL isDefault = (linphone_core_get_default_proxy_config(lc) == config);
BOOL isDefault = (linphone_core_get_default_proxy_config(LC) == config);
const LinphoneAuthInfo *ai = linphone_proxy_config_find_auth_info(config);
linphone_core_remove_proxy_config(lc, config);
linphone_core_remove_proxy_config(LC, config);
if (ai) {
linphone_core_remove_auth_info(lc, ai);
linphone_core_remove_auth_info(LC, ai);
}
[self setInteger:-1 forKey:@"current_proxy_config_preference"];
if (isDefault) {
// if we removed the default proxy config, set another one instead
if (linphone_core_get_proxy_config_list(lc) != NULL) {
linphone_core_set_default_proxy_index(lc, 0);
if (linphone_core_get_proxy_config_list(LC) != NULL) {
linphone_core_set_default_proxy_index(LC, 0);
}
}
[self transformLinphoneCoreToKeys];

View file

@ -161,7 +161,7 @@ typedef struct _LinphoneManagerSounds {
+ (NSString*)cacheDirectory;
- (void)acceptCall:(LinphoneCall *)call evenWithVideo:(BOOL)video;
- (BOOL)call:(const LinphoneAddress *)address transfer:(BOOL)transfer;
- (BOOL)call:(const LinphoneAddress *)address;
+(id)getMessageAppDataForKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg;
+(void)setValueInMessageAppData:(id)value forKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg;
@ -216,5 +216,6 @@ typedef struct _LinphoneManagerSounds {
@property (readonly) LpConfig *configDb;
@property(readonly) InAppProductsManager *iapManager;
@property(strong, nonatomic) NSMutableArray *fileTransferDelegates;
@property BOOL nextCallIsTransfer;
@end

View file

@ -108,22 +108,6 @@ NSString *const kLinphoneInternalChatDBFilename = @"linphone_chats.db";
@implementation LinphoneManager
@synthesize connectivity;
@synthesize network;
@synthesize frontCamId;
@synthesize backCamId;
@synthesize database;
@synthesize fastAddressBook;
@synthesize pushNotificationToken;
@synthesize sounds;
@synthesize logs;
@synthesize speakerEnabled;
@synthesize bluetoothAvailable;
@synthesize bluetoothEnabled;
@synthesize photoLibrary;
@synthesize tunnelMode;
@synthesize silentPushCompletion;
@synthesize wasRemoteProvisioned;
@synthesize configDb;
struct codec_name_pref_table {
const char *name;
@ -252,25 +236,25 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre
if ((self = [super init])) {
AudioSessionInitialize(NULL, NULL, NULL, NULL);
[NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(audioRouteChangeListenerCallback2:)
selector:@selector(audioRouteChangeListenerCallback:)
name:AVAudioSessionRouteChangeNotification
object:nil];
NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"];
self.messagePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:path] error:nil];
sounds.vibrate = kSystemSoundID_Vibrate;
_sounds.vibrate = kSystemSoundID_Vibrate;
logs = [[NSMutableArray alloc] init];
database = NULL;
speakerEnabled = FALSE;
bluetoothEnabled = FALSE;
tunnelMode = FALSE;
_logs = [[NSMutableArray alloc] init];
_database = NULL;
_speakerEnabled = FALSE;
_bluetoothEnabled = FALSE;
_tunnelMode = FALSE;
_fileTransferDelegates = [[NSMutableArray alloc] init];
pushCallIDs = [[NSMutableArray alloc] init];
photoLibrary = [[ALAssetsLibrary alloc] init];
_photoLibrary = [[ALAssetsLibrary alloc] init];
_isTesting = [LinphoneManager isRunningTests];
[self renameDefaultSettings];
@ -280,9 +264,9 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre
// set default values for first boot
if ([self lpConfigStringForKey:@"debugenable_preference"] == nil) {
#ifdef DEBUG
[self lpConfigSetBool:TRUE forKey:@"debugenable_preference"];
[self lpConfigSetInt:1 forKey:@"debugenable_preference"];
#else
[self lpConfigSetBool:FALSE forKey:@"debugenable_preference"];
[self lpConfigSetInt:0 forKey:@"debugenable_preference"];
#endif
}
@ -296,10 +280,10 @@ struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_pre
}
- (void)silentPushFailed:(NSTimer *)timer {
if (silentPushCompletion) {
LOGI(@"silentPush failed, silentPushCompletion block: %p", silentPushCompletion);
silentPushCompletion(UIBackgroundFetchResultNoData);
silentPushCompletion = nil;
if (_silentPushCompletion) {
LOGI(@"silentPush failed, silentPushCompletion block: %p", _silentPushCompletion);
_silentPushCompletion(UIBackgroundFetchResultNoData);
_silentPushCompletion = nil;
}
}
@ -436,7 +420,7 @@ exit_dbmigration:
- (void)migrateFromUserPrefs {
static NSString *migration_flag = @"userpref_migration_done";
if (configDb == nil)
if (_configDb == nil)
return;
if ([self lpConfigIntForKey:migration_flag withDefault:0]) {
@ -531,7 +515,7 @@ static void migrateWizardToAssistant(const char *entry, void *user_data) {
}
- (void)migrationFromVersion2To3 {
lp_config_for_each_entry(configDb, "wizard", migrateWizardToAssistant, (__bridge void *)(self));
lp_config_for_each_entry(_configDb, "wizard", migrateWizardToAssistant, (__bridge void *)(self));
}
#pragma mark - Linphone Core Functions
@ -573,10 +557,10 @@ static void dump_section(const char *section, void *data) {
#pragma mark - Logs Functions handlers
static void linphone_iphone_log_user_info(struct _LinphoneCore *lc, const char *message) {
linphone_iphone_log_handler(ORTP_MESSAGE, message, NULL);
linphone_iphone_log_handler(NULL, ORTP_MESSAGE, message, NULL);
}
static void linphone_iphone_log_user_warning(struct _LinphoneCore *lc, const char *message) {
linphone_iphone_log_handler(ORTP_WARNING, message, NULL);
linphone_iphone_log_handler(NULL, ORTP_WARNING, message, NULL);
}
#pragma mark - Display Status Functions
@ -615,13 +599,13 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char
linphone_call_set_user_data(call, (void *)CFBridgingRetain(data));
}
if (silentPushCompletion) {
if (_silentPushCompletion) {
// we were woken up by a silent push. Call the completion handler with NEWDATA
// so that the push is notified to the user
LOGI(@"onCall - handler %p", silentPushCompletion);
silentPushCompletion(UIBackgroundFetchResultNewData);
silentPushCompletion = nil;
LOGI(@"onCall - handler %p", _silentPushCompletion);
_silentPushCompletion(UIBackgroundFetchResultNewData);
_silentPushCompletion = nil;
}
const LinphoneAddress *addr = linphone_call_get_remote_address(call);
@ -708,10 +692,10 @@ static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char
if (linphone_core_get_calls_nb(theLinphoneCore) == 0) {
[self setSpeakerEnabled:FALSE];
[self removeCTCallCenterCb];
// disable this because I don't find anygood reason for it: bluetoothAvailable = FALSE;
// disable this because I don't find anygood reason for it: _bluetoothAvailable = FALSE;
// furthermore it introduces a bug when calling multiple times since route may not be
// reconfigured between cause leading to bluetooth being disabled while it should not
bluetoothEnabled = FALSE;
_bluetoothEnabled = FALSE;
/*IOS specific*/
linphone_core_start_dtmf_stream(theLinphoneCore);
}
@ -833,12 +817,8 @@ static void linphone_iphone_configuring_status_changed(LinphoneCore *lc, Linphon
}
- (void)configuringStateChangedNotificationHandler:(NSNotification *)notif {
if ((LinphoneConfiguringState)[[[notif userInfo] valueForKey:@"state"] integerValue] ==
LinphoneConfiguringSuccessful) {
wasRemoteProvisioned = TRUE;
} else {
wasRemoteProvisioned = FALSE;
}
_wasRemoteProvisioned = ((LinphoneConfiguringState)[[[notif userInfo] valueForKey:@"state"] integerValue] ==
LinphoneConfiguringSuccessful);
}
#pragma mark - Registration State Functions
@ -917,16 +897,20 @@ static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char
#pragma mark - Text Received Functions
- (void)onMessageReceived:(LinphoneCore *)lc room:(LinphoneChatRoom *)room message:(LinphoneChatMessage *)msg {
if (silentPushCompletion) {
if (_silentPushCompletion) {
// we were woken up by a silent push. Call the completion handler with NEWDATA
// so that the push is notified to the user
LOGI(@"onMessageReceived - handler %p", silentPushCompletion);
silentPushCompletion(UIBackgroundFetchResultNewData);
silentPushCompletion = nil;
LOGI(@"onMessageReceived - handler %p", _silentPushCompletion);
_silentPushCompletion(UIBackgroundFetchResultNewData);
_silentPushCompletion = nil;
}
NSString *callID = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(msg, "Call-ID")];
const LinphoneAddress *remoteAddress = linphone_chat_message_get_from_address(msg);
NSString *from = [FastAddressBook displayNameForAddress:remoteAddress];
const char *chat = linphone_chat_message_get_text(msg);
if (chat == NULL)
chat = "";
char *c_address = linphone_address_as_string_uri_only(remoteAddress);
NSString *remote_uri = [NSString stringWithUTF8String:c_address];
@ -1330,8 +1314,8 @@ static LinphoneCoreVTable linphonec_vtable = {
_contactSipField = [self lpConfigStringForKey:@"contact_im_type_value" withDefault:@"SIP"];
if (fastAddressBook == nil) {
fastAddressBook = [[FastAddressBook alloc] init];
if (_fastAddressBook == nil) {
_fastAddressBook = [[FastAddressBook alloc] init];
}
linphone_core_set_root_ca(theLinphoneCore, lRootCa);
@ -1354,16 +1338,16 @@ static LinphoneCoreVTable linphonec_vtable = {
}
/*DETECT cameras*/
frontCamId = backCamId = nil;
_frontCamId = _backCamId = nil;
char **camlist = (char **)linphone_core_get_video_devices(theLinphoneCore);
for (char *cam = *camlist; *camlist != NULL; cam = *++camlist) {
if (strcmp(FRONT_CAM_NAME, cam) == 0) {
frontCamId = cam;
_frontCamId = cam;
// great set default cam to front
linphone_core_set_video_device(theLinphoneCore, cam);
}
if (strcmp(BACK_CAM_NAME, cam) == 0) {
backCamId = cam;
_backCamId = cam;
}
}
@ -1439,8 +1423,7 @@ static BOOL libStarted = FALSE;
LOGI(@"linphonecore is already created");
return;
}
linphone_core_set_log_collection_path([[LinphoneManager cacheDirectory] UTF8String]);
[Log enableLogs:[self lpConfigBoolForKey:@"debugenable_preference"]];
[Log enableLogs:[self lpConfigIntForKey:@"debugenable_preference"]];
connectivity = none;
ms_init(); // Need to initialize mediastreamer2 before loading the plugins
@ -1453,29 +1436,27 @@ static BOOL libStarted = FALSE;
libmsbcg729_init(ms_factory_get_fallback());
libmswebrtc_init(ms_factory_get_fallback());
theLinphoneCore = linphone_core_new_with_config(&linphonec_vtable, configDb, (__bridge void *)(self));
theLinphoneCore = linphone_core_new_with_config(&linphonec_vtable, _configDb, (__bridge void *)(self));
LOGI(@"Create linphonecore %p", theLinphoneCore);
// Set audio assets
NSString *ring =
([LinphoneManager bundleFile:[NSString stringWithUTF8String:linphone_core_get_ringback(theLinphoneCore) ?: ""]
.lastPathComponent]
([LinphoneManager
bundleFile:[NSString stringWithUTF8String:linphone_core_get_ring(theLinphoneCore) ?: ""].lastPathComponent]
?: [LinphoneManager bundleFile:@"notes_of_the_optimistic.caf"])
.lastPathComponent;
NSString *ringback =
([LinphoneManager
bundleFile:[NSString stringWithUTF8String:linphone_core_get_remote_ringback_tone(theLinphoneCore) ?: ""]
.lastPathComponent]
([LinphoneManager bundleFile:[NSString stringWithUTF8String:linphone_core_get_ringback(theLinphoneCore) ?: ""]
.lastPathComponent]
?: [LinphoneManager bundleFile:@"ringback.wav"])
.lastPathComponent;
NSString *hold =
([LinphoneManager bundleFile:[NSString stringWithUTF8String:linphone_core_get_play_file(theLinphoneCore) ?: ""]
.lastPathComponent]
?: [LinphoneManager bundleFile:@"hold.caf"])
?: [LinphoneManager bundleFile:@"hold.mkv"])
.lastPathComponent;
linphone_core_set_ringback(theLinphoneCore, [LinphoneManager bundleFile:ring].UTF8String);
linphone_core_set_remote_ringback_tone(theLinphoneCore, [LinphoneManager bundleFile:ringback].UTF8String);
linphone_core_set_ring(theLinphoneCore, [LinphoneManager bundleFile:ring].UTF8String);
linphone_core_set_ringback(theLinphoneCore, [LinphoneManager bundleFile:ringback].UTF8String);
linphone_core_set_play_file(theLinphoneCore, [LinphoneManager bundleFile:hold].UTF8String);
/* set the CA file no matter what, since the remote provisioning could be hitting an HTTPS server */
@ -1514,8 +1495,6 @@ static BOOL libStarted = FALSE;
// just in case
[self removeCTCallCenterCb];
[NSNotificationCenter.defaultCenter removeObserver:self];
if (theLinphoneCore != nil) { // just in case application terminate before linphone core initialization
for (FileTransferDelegate *ftd in _fileTransferDelegates) {
@ -1541,6 +1520,7 @@ static BOOL libStarted = FALSE;
proxyReachability = nil;
}
libStarted = FALSE;
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)resetLinphoneCore {
@ -1790,24 +1770,30 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
factory = factoryIpad;
}
NSString *confiFileName = [LinphoneManager documentFile:@"linphonerc"];
configDb = lp_config_new_with_factory([confiFileName UTF8String], [factory UTF8String]);
_configDb = lp_config_new_with_factory([confiFileName UTF8String], [factory UTF8String]);
}
#pragma mark - Audio route Functions
- (bool)allowSpeaker {
bool notallow = false;
if (IPAD)
return true;
bool allow = true;
CFStringRef lNewRoute = CFSTR("Unknown");
UInt32 lNewRouteSize = sizeof(lNewRoute);
OSStatus lStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &lNewRouteSize, &lNewRoute);
if (!lStatus && lNewRouteSize > 0) {
NSString *route = (__bridge NSString *)lNewRoute;
notallow = [route containsString:@"Heads"] || [route isEqualToString:@"Lineout"] || IPAD;
allow = ![route containsString:@"Heads"] && ![route isEqualToString:@"Lineout"];
CFRelease(lNewRoute);
}
return !notallow;
return allow;
}
- (void)audioRouteChangeListenerCallback2:(NSNotification *)notif {
- (void)audioRouteChangeListenerCallback:(NSNotification *)notif {
if (IPAD)
return;
// there is at least one bug when you disconnect an audio bluetooth headset
// since we only get notification of route having changed, we cannot tell if that is due to:
// -bluetooth headset disconnected or
@ -1815,7 +1801,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
// the only thing we can assume is that when we lost a device, it must be a bluetooth one (strong hypothesis though)
if ([[notif.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue] ==
AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
bluetoothAvailable = NO;
_bluetoothAvailable = NO;
}
CFStringRef newRoute = CFSTR("Unknown");
@ -1826,15 +1812,15 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
NSString *route = (__bridge NSString *)newRoute;
LOGI(@"Current audio route is [%s]", [route UTF8String]);
speakerEnabled = [route isEqualToString:@"Speaker"] || [route isEqualToString:@"SpeakerAndMicrophone"];
if (!IPAD && [route isEqualToString:@"HeadsetBT"] && !speakerEnabled) {
bluetoothAvailable = TRUE;
bluetoothEnabled = TRUE;
_speakerEnabled = [route isEqualToString:@"Speaker"] || [route isEqualToString:@"SpeakerAndMicrophone"];
if ([route isEqualToString:@"HeadsetBT"] && !_speakerEnabled) {
_bluetoothAvailable = TRUE;
_bluetoothEnabled = TRUE;
} else {
bluetoothEnabled = FALSE;
_bluetoothEnabled = FALSE;
}
NSDictionary *dict =
[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:bluetoothAvailable], @"available", nil];
NSDictionary *dict = [NSDictionary
dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:_bluetoothAvailable], @"available", nil];
[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneBluetoothAvailabilityUpdate
object:self
userInfo:dict];
@ -1844,17 +1830,17 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (void)setSpeakerEnabled:(BOOL)enable {
OSStatus ret;
speakerEnabled = enable;
_speakerEnabled = enable;
UInt32 override = kAudioSessionUnspecifiedError;
if (!enable && bluetoothAvailable) {
UInt32 bluetoothInputOverride = bluetoothEnabled;
if (!enable && _bluetoothAvailable) {
UInt32 bluetoothInputOverride = _bluetoothEnabled;
ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
sizeof(bluetoothInputOverride), &bluetoothInputOverride);
// if setting bluetooth failed, it must be because the device is not available
// anymore (disconnected), so deactivate bluetooth.
if (ret != kAudioSessionNoError) {
bluetoothAvailable = bluetoothEnabled = FALSE;
_bluetoothAvailable = _bluetoothEnabled = FALSE;
}
}
@ -1862,7 +1848,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
if (enable && [self allowSpeaker]) {
override = kAudioSessionOverrideAudioRoute_Speaker;
ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(override), &override);
bluetoothEnabled = FALSE;
_bluetoothEnabled = FALSE;
} else {
override = kAudioSessionOverrideAudioRoute_None;
ret = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(override), &override);
@ -1875,14 +1861,10 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
}
- (void)setBluetoothEnabled:(BOOL)enable {
if (bluetoothAvailable) {
if (_bluetoothAvailable) {
// The change of route will be done in setSpeakerEnabled
bluetoothEnabled = enable;
if (bluetoothEnabled) {
[self setSpeakerEnabled:FALSE];
} else {
[self setSpeakerEnabled:speakerEnabled];
}
_bluetoothEnabled = enable;
[self setSpeakerEnabled:!_bluetoothEnabled && _speakerEnabled];
}
}
@ -1907,7 +1889,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
linphone_core_accept_call_with_params(theLinphoneCore, call, lcallParams);
}
- (BOOL)call:(const LinphoneAddress *)iaddr transfer:(BOOL)transfer {
- (BOOL)call:(const LinphoneAddress *)iaddr {
// First verify that network is available, abort otherwise.
if (!linphone_core_is_network_reachable(theLinphoneCore)) {
UIAlertView *error = [[UIAlertView alloc]
@ -1967,9 +1949,11 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
linphone_address_set_domain(
addr, [[LinphoneManager.instance lpConfigStringForKey:@"domain" inSection:@"assistant"] UTF8String]);
}
if (transfer) {
if (LinphoneManager.instance.nextCallIsTransfer) {
char *caddr = linphone_address_as_string(addr);
linphone_core_transfer_call(theLinphoneCore, linphone_core_get_current_call(theLinphoneCore), caddr);
LinphoneManager.instance.nextCallIsTransfer = NO;
ms_free(caddr);
} else {
LinphoneCall *call = linphone_core_invite_address_with_params(theLinphoneCore, addr, lcallParams);
@ -1995,16 +1979,11 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
#pragma mark - Property Functions
- (void)setPushNotificationToken:(NSData *)apushNotificationToken {
if (apushNotificationToken == pushNotificationToken) {
if (apushNotificationToken == _pushNotificationToken) {
return;
}
if (pushNotificationToken != nil) {
pushNotificationToken = nil;
}
_pushNotificationToken = apushNotificationToken;
if (apushNotificationToken != nil) {
pushNotificationToken = apushNotificationToken;
}
LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(theLinphoneCore);
if (cfg) {
linphone_proxy_config_edit(cfg);
@ -2014,7 +1993,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
}
- (void)configurePushTokenForProxyConfig:(LinphoneProxyConfig *)proxyCfg {
NSData *tokenData = pushNotificationToken;
NSData *tokenData = _pushNotificationToken;
if (tokenData != nil && [self lpConfigBoolForKey:@"pushnotification_preference"]) {
const unsigned char *tokenBuffer = [tokenData bytes];
NSMutableString *tokenString = [NSMutableString stringWithCapacity:[tokenData length] * 2];
@ -2090,7 +2069,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
}
+ (BOOL)copyFile:(NSString *)src destination:(NSString *)dst override:(BOOL)override {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSFileManager *fileManager = NSFileManager.defaultManager;
NSError *error = nil;
if ([fileManager fileExistsAtPath:src] == NO) {
LOGE(@"Can't find \"%@\": %@", src, [error localizedDescription]);
@ -2119,7 +2098,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (void)configureVbrCodecs {
PayloadType *pt;
int bitrate = lp_config_get_int(
configDb, "audio", "codec_bitrate_limit",
_configDb, "audio", "codec_bitrate_limit",
kLinphoneAudioVbrCodecDefaultBitrate); /*default value is in linphonerc or linphonerc-factory*/
const MSList *audio_codecs = linphone_core_get_audio_codecs(theLinphoneCore);
const MSList *codec = audio_codecs;
@ -2174,7 +2153,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key inSection:(NSString *)section {
if (!key)
return;
lp_config_set_string(configDb, [section UTF8String], [key UTF8String], value ? [value UTF8String] : NULL);
lp_config_set_string(_configDb, [section UTF8String], [key UTF8String], value ? [value UTF8String] : NULL);
}
- (NSString *)lpConfigStringForKey:(NSString *)key {
return [self lpConfigStringForKey:key withDefault:nil];
@ -2188,7 +2167,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section withDefault:(NSString *)defaultValue {
if (!key)
return defaultValue;
const char *value = lp_config_get_string(configDb, [section UTF8String], [key UTF8String], NULL);
const char *value = lp_config_get_string(_configDb, [section UTF8String], [key UTF8String], NULL);
return value ? [NSString stringWithUTF8String:value] : defaultValue;
}
@ -2198,7 +2177,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (void)lpConfigSetInt:(int)value forKey:(NSString *)key inSection:(NSString *)section {
if (!key)
return;
lp_config_set_int(configDb, [section UTF8String], [key UTF8String], (int)value);
lp_config_set_int(_configDb, [section UTF8String], [key UTF8String], (int)value);
}
- (int)lpConfigIntForKey:(NSString *)key {
return [self lpConfigIntForKey:key withDefault:-1];
@ -2212,7 +2191,7 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section withDefault:(int)defaultValue {
if (!key)
return defaultValue;
return lp_config_get_int(configDb, [section UTF8String], [key UTF8String], (int)defaultValue);
return lp_config_get_int(_configDb, [section UTF8String], [key UTF8String], (int)defaultValue);
}
- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key {
@ -2295,8 +2274,8 @@ static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
- (void)setTunnelMode:(TunnelMode)atunnelMode {
LinphoneTunnel *tunnel = linphone_core_get_tunnel(theLinphoneCore);
tunnelMode = atunnelMode;
switch (tunnelMode) {
_tunnelMode = atunnelMode;
switch (_tunnelMode) {
case tunnel_off:
linphone_tunnel_enable(tunnel, false);
break;

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15B42" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
@ -34,7 +34,7 @@
</label>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="2" contentMode="left" text="John Doe" lineBreakMode="tailTruncation" minimumFontSize="10" adjustsFontSizeToFit="NO" id="20" userLabel="addressLabel">
<rect key="frame" x="59" y="0.0" width="275" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration" label="Contact name"/>
<fontDescription key="fontDescription" type="system" pointSize="25"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
@ -50,15 +50,15 @@
</label>
<view hidden="YES" autoresizesSubviews="NO" userInteractionEnabled="NO" tag="7" contentMode="scaleToFill" id="7DE-KJ-9Q3" userLabel="unreadCountView" customClass="UIBouncingView">
<rect key="frame" x="350" y="7" width="21" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" tag="8" contentMode="scaleAspectFit" image="history_chat_indicator.png" id="NXj-A8-YLh" userLabel="unreadCountImage">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
</imageView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="9" contentMode="left" text="99" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="7" id="ZXq-Do-7Ua" userLabel="unreadCountLabel">
<rect key="frame" x="0.0" y="0.0" width="21" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<accessibility key="accessibilityConfiguration">
<accessibilityTraits key="traits" none="YES"/>
<bool key="isElement" value="NO"/>

View file

@ -172,14 +172,13 @@
- (void)proxyConfigUpdate:(LinphoneProxyConfig *)config {
LinphoneRegistrationState state = LinphoneRegistrationNone;
NSString *message = nil;
LinphoneCore *lc = LC;
LinphoneGlobalState gstate = linphone_core_get_global_state(lc);
LinphoneGlobalState gstate = linphone_core_get_global_state(LC);
if (gstate == LinphoneGlobalConfiguring) {
message = NSLocalizedString(@"Fetching remote configuration", nil);
} else if (config == NULL) {
state = LinphoneRegistrationNone;
if (linphone_core_get_proxy_config_list(lc) != NULL) {
if (linphone_core_get_proxy_config_list(LC) != NULL) {
if (linphone_core_is_network_reachable(LC)) {
message = NSLocalizedString(@"No default account", nil);
} else {
@ -218,13 +217,14 @@
#pragma mark -
- (void)updateUI:(BOOL)inCall {
// nothing changed
if (_outcallView.hidden == inCall)
return;
BOOL hasChanged = (_outcallView.hidden != inCall);
_outcallView.hidden = inCall;
_incallView.hidden = !inCall;
if (!hasChanged)
return;
if (callQualityTimer) {
[callQualityTimer invalidate];
callQualityTimer = nil;
@ -340,10 +340,9 @@
}
- (IBAction)onRegistrationStateClick:(id)sender {
LinphoneCore *lc = LC;
if (linphone_core_get_default_proxy_config(lc)) {
linphone_core_refresh_registers(lc);
} else if (linphone_core_get_proxy_config_list(lc)) {
if (linphone_core_get_default_proxy_config(LC)) {
linphone_core_refresh_registers(LC);
} else if (linphone_core_get_proxy_config_list(LC)) {
[PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription];
} else {
[PhoneMainView.instance changeCurrentView:AssistantView.compositeViewDescription];

View file

@ -26,6 +26,6 @@
@property(nonatomic, strong) IBOutlet UITextField *addressField;
- (void)updateVideoPolicy;
- (void)updateIcon;
@end

View file

@ -61,13 +61,12 @@
- (void)touchUp:(id)sender {
NSString *address = addressField.text;
if (address.length == 0) {
LinphoneCore *lc = LC;
LinphoneCallLog *log = linphone_core_get_last_outgoing_call_log(lc);
LinphoneCallLog *log = linphone_core_get_last_outgoing_call_log(LC);
if (log) {
LinphoneAddress *to = linphone_call_log_get_to(log);
const char *domain = linphone_address_get_domain(to);
char *bis_address = NULL;
LinphoneProxyConfig *def_proxy = linphone_core_get_default_proxy_config(lc);
LinphoneProxyConfig *def_proxy = linphone_core_get_default_proxy_config(LC);
// if the 'to' address is on the default proxy, only present the username
if (def_proxy) {
@ -88,20 +87,27 @@
if ([address length] > 0) {
LinphoneAddress *addr = linphone_core_interpret_url(LC, address.UTF8String);
[LinphoneManager.instance call:addr transfer:FALSE];
[LinphoneManager.instance call:addr];
if (addr)
linphone_address_destroy(addr);
}
}
- (void)updateVideoPolicy {
LinphoneCore *lc = LC;
if (linphone_core_video_capture_enabled(lc) && linphone_core_get_video_policy(lc)->automatically_initiate) {
- (void)updateIcon {
if (linphone_core_video_capture_enabled(LC) && linphone_core_get_video_policy(LC)->automatically_initiate) {
[self setImage:[UIImage imageNamed:@"call_video_start_default.png"] forState:UIControlStateNormal];
[self setImage:[UIImage imageNamed:@"call_video_start_disabled.png"] forState:UIControlStateDisabled];
} else {
[self setImage:[UIImage imageNamed:@"call_audio_start_default.png"] forState:UIControlStateNormal];
[self setImage:[UIImage imageNamed:@"call_audio_start_disabled.png"] forState:UIControlStateDisabled];
}
if (LinphoneManager.instance.nextCallIsTransfer) {
[self setImage:[UIImage imageNamed:@"call_transfer_default.png"] forState:UIControlStateNormal];
[self setImage:[UIImage imageNamed:@"call_transfer_disabled.png"] forState:UIControlStateDisabled];
} else if (linphone_core_get_calls_nb(LC) > 0) {
[self setImage:[UIImage imageNamed:@"call_add_default.png"] forState:UIControlStateNormal];
[self setImage:[UIImage imageNamed:@"call_add_disabled.png"] forState:UIControlStateDisabled];
}
}
@end

View file

@ -76,7 +76,7 @@
- (IBAction)onCallClick:(id)event {
LinphoneAddress *addr = linphone_core_interpret_url(LC, _addressLabel.text.UTF8String);
[LinphoneManager.instance call:addr transfer:NO];
[LinphoneManager.instance call:addr];
if (addr)
linphone_address_destroy(addr);
}

View file

@ -30,9 +30,9 @@
return linphone_call_params_get_local_conference_mode(linphone_call_get_current_params(call));
}
+ (int)callCount:(LinphoneCore *)lc {
+ (int)callCount {
int count = 0;
const MSList *calls = linphone_core_get_calls(lc);
const MSList *calls = linphone_core_get_calls(LC);
while (calls != 0) {
if (![UIHangUpButton isInConference:((LinphoneCall *)calls->data)]) {
@ -76,11 +76,10 @@
#pragma mark -
- (void)update {
LinphoneCore *lc = LC;
if (linphone_core_get_calls_nb(lc) == 1 || // One call
linphone_core_get_current_call(lc) != NULL || // In call
linphone_core_is_in_conference(lc) || // In conference
(linphone_core_get_conference_size(lc) > 0 && [UIHangUpButton callCount:lc] == 0) // Only one conf
if (linphone_core_get_calls_nb(LC) == 1 || // One call
linphone_core_get_current_call(LC) != NULL || // In call
linphone_core_is_in_conference(LC) || // In conference
(linphone_core_get_conference_size(LC) > 0 && [UIHangUpButton callCount] == 0) // Only one conf
) {
[self setEnabled:true];
return;
@ -91,18 +90,17 @@
#pragma mark - Action Functions
- (void)touchUp:(id)sender {
LinphoneCore *lc = LC;
LinphoneCall *currentcall = linphone_core_get_current_call(lc);
if (linphone_core_is_in_conference(lc) || // In conference
(linphone_core_get_conference_size(lc) > 0 && [UIHangUpButton callCount:lc] == 0) // Only one conf
LinphoneCall *currentcall = linphone_core_get_current_call(LC);
if (linphone_core_is_in_conference(LC) || // In conference
(linphone_core_get_conference_size(LC) > 0 && [UIHangUpButton callCount] == 0) // Only one conf
) {
linphone_core_terminate_conference(lc);
linphone_core_terminate_conference(LC);
} else if (currentcall != NULL) { // In a call
linphone_core_terminate_call(lc, currentcall);
linphone_core_terminate_call(LC, currentcall);
} else {
const MSList *calls = linphone_core_get_calls(lc);
const MSList *calls = linphone_core_get_calls(LC);
if (ms_list_size(calls) == 1) { // Only one call
linphone_core_terminate_call(lc, (LinphoneCall *)(calls->data));
linphone_core_terminate_call(LC, (LinphoneCall *)(calls->data));
}
}
}

View file

@ -32,7 +32,7 @@
}
- (bool)onUpdate {
return !linphone_core_mic_enabled(LC);
return !(linphone_core_get_current_call(LC) && linphone_core_mic_enabled(LC));
}
@end

View file

@ -61,24 +61,10 @@
return linphone_call_params_get_local_conference_mode(linphone_call_get_current_params(call));
}
+ (int)notInConferenceCallCount:(LinphoneCore *)lc {
int count = 0;
const MSList *calls = linphone_core_get_calls(lc);
while (calls != 0) {
if (![UIPauseButton isInConference:(LinphoneCall *)calls->data]) {
count++;
}
calls = calls->next;
}
return count;
}
+ (LinphoneCall *)getCall {
LinphoneCore *lc = LC;
LinphoneCall *currentCall = linphone_core_get_current_call(lc);
if (currentCall == nil && linphone_core_get_calls_nb(lc) == 1) {
currentCall = (LinphoneCall *)linphone_core_get_calls(lc)->data;
LinphoneCall *currentCall = linphone_core_get_current_call(LC);
if (currentCall == nil && linphone_core_get_calls_nb(LC) == 1) {
currentCall = (LinphoneCall *)linphone_core_get_calls(LC)->data;
}
return currentCall;
}
@ -151,13 +137,12 @@
- (bool)onUpdate {
bool ret = false;
LinphoneCore *lc = LC;
LinphoneCall *c = call;
switch (type) {
case UIPauseButtonType_Conference: {
self.enabled = (linphone_core_get_conference_size(lc) > 0);
self.enabled = (linphone_core_get_conference_size(LC) > 0);
if (self.enabled) {
ret = (!linphone_core_is_in_conference(lc));
ret = (!linphone_core_is_in_conference(LC));
}
break;
}

View file

@ -26,39 +26,27 @@
@implementation UISpeakerButton
#pragma mark - Static Functions
static void audioRouteChangeListenerCallback(void *inUserData, // 1
AudioSessionPropertyID inPropertyID, // 2
UInt32 inPropertyValueSize, // 3
const void *inPropertyValue // 4
) {
if (inPropertyID != kAudioSessionProperty_AudioRouteChange)
return; // 5
UISpeakerButton *button = (__bridge UISpeakerButton *)inUserData;
[button update];
}
INIT_WITH_COMMON_CF {
AudioSessionInitialize(NULL, NULL, NULL, NULL);
OSStatus lStatus = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback, (__bridge void *)(self));
if (lStatus) {
LOGE(@"cannot register route change handler [%ld]", lStatus);
}
[NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(audioRouteChangeListenerCallback:)
name:AVAudioSessionRouteChangeNotification
object:nil];
return self;
}
- (void)dealloc {
OSStatus lStatus = AudioSessionRemovePropertyListenerWithUserData(
kAudioSessionProperty_AudioRouteChange, audioRouteChangeListenerCallback, (__bridge void *)(self));
if (lStatus) {
LOGE(@"cannot un register route change handler [%ld]", lStatus);
}
[NSNotificationCenter.defaultCenter removeObserver:self];
}
#pragma mark - UIToggleButtonDelegate Functions
- (void)audioRouteChangeListenerCallback:(NSNotification *)notif {
if ([[notif.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue] ==
AVAudioSessionRouteChangeReasonRouteConfigurationChange) {
[self update];
}
}
- (void)onOn {
[LinphoneManager.instance setSpeakerEnabled:TRUE];
}
@ -68,7 +56,7 @@ INIT_WITH_COMMON_CF {
}
- (bool)onUpdate {
[self setEnabled:[LinphoneManager.instance allowSpeaker]];
self.enabled = [LinphoneManager.instance allowSpeaker];
return [LinphoneManager.instance speakerEnabled];
}

View file

@ -51,7 +51,6 @@
}
return self;
}
#pragma mark -
- (void)touchUp:(id)sender {

View file

@ -1,28 +0,0 @@
/* UITransferButton.h
*
* Copyright (C) 2012 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 "UIIconButton.h"
@interface UITransferButton : UIIconButton
@property(nonatomic, strong) IBOutlet UITextField *addressField;
@end

View file

@ -1,67 +0,0 @@
/* UITransferButton.m
*
* Copyright (C) 2012 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 "UITransferButton.h"
#import "LinphoneManager.h"
#import <CoreTelephony/CTCallCenter.h>
@implementation UITransferButton
@synthesize addressField;
#pragma mark - Lifecycle Functions
- (void)initUICallButton {
[self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside];
}
- (id)init {
self = [super init];
if (self) {
[self initUICallButton];
}
return self;
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self initUICallButton];
}
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super initWithCoder:decoder];
if (self) {
[self initUICallButton];
}
return self;
}
#pragma mark -
- (void)touchUp:(id)sender {
LinphoneAddress *addr = linphone_core_interpret_url(LC, addressField.text.UTF8String);
[LinphoneManager.instance call:addr transfer:TRUE];
if (addr)
linphone_address_destroy(addr);
}
@end

View file

@ -33,9 +33,8 @@ INIT_WITH_COMMON_CF {
}
- (void)onOn {
LinphoneCore *lc = LC;
if (!linphone_core_video_display_enabled(lc))
if (!linphone_core_video_display_enabled(LC))
return;
[self setEnabled:FALSE];
@ -48,7 +47,7 @@ INIT_WITH_COMMON_CF {
TRUE; /* will be used later to notify user if video was not activated because of the linphone core*/
LinphoneCallParams *call_params = linphone_call_params_copy(linphone_call_get_current_params(call));
linphone_call_params_enable_video(call_params, TRUE);
linphone_core_update_call(lc, call, call_params);
linphone_core_update_call(LC, call, call_params);
linphone_call_params_destroy(call_params);
} else {
LOGW(@"Cannot toggle video button, because no current call");
@ -56,9 +55,8 @@ INIT_WITH_COMMON_CF {
}
- (void)onOff {
LinphoneCore *lc = LC;
if (!linphone_core_video_display_enabled(lc))
if (!linphone_core_video_display_enabled(LC))
return;
[self setEnabled:FALSE];
@ -68,7 +66,7 @@ INIT_WITH_COMMON_CF {
if (call) {
LinphoneCallParams *call_params = linphone_call_params_copy(linphone_call_get_current_params(call));
linphone_call_params_enable_video(call_params, FALSE);
linphone_core_update_call(lc, call, call_params);
linphone_core_update_call(LC, call, call_params);
linphone_call_params_destroy(call_params);
} else {
LOGW(@"Cannot toggle video button, because no current call");
@ -77,10 +75,9 @@ INIT_WITH_COMMON_CF {
- (bool)onUpdate {
bool video_enabled = false;
LinphoneCore *lc = LC;
LinphoneCall *currentCall = linphone_core_get_current_call(lc);
if (linphone_core_video_supported(lc)) {
if (linphone_core_video_display_enabled(lc) && currentCall && !linphone_call_media_in_progress(currentCall) &&
LinphoneCall *currentCall = linphone_core_get_current_call(LC);
if (linphone_core_video_supported(LC)) {
if (linphone_core_video_display_enabled(LC) && currentCall && !linphone_call_media_in_progress(currentCall) &&
linphone_call_get_state(currentCall) == LinphoneCallStreamsRunning) {
video_enabled = TRUE;
}

View file

@ -19,19 +19,18 @@
#import "LinphoneManager.h"
#define APP_LVL 1 << 7
#define LOGV(level, ...) [Log log:APP_LVL & level file:__FILE__ line:__LINE__ format:__VA_ARGS__]
#define LOGD(...) LOGV(APP_LVL | ORTP_DEBUG, __VA_ARGS__)
#define LOGI(...) LOGV(APP_LVL | ORTP_MESSAGE, __VA_ARGS__)
#define LOGW(...) LOGV(APP_LVL | ORTP_WARNING, __VA_ARGS__)
#define LOGE(...) LOGV(APP_LVL | ORTP_ERROR, __VA_ARGS__)
#define LOGF(...) LOGV(APP_LVL | ORTP_FATAL, __VA_ARGS__)
#define LOGV(level, ...) [Log log:level file:__FILE__ line:__LINE__ format:__VA_ARGS__]
#define LOGD(...) LOGV(ORTP_DEBUG, __VA_ARGS__)
#define LOGI(...) LOGV(ORTP_MESSAGE, __VA_ARGS__)
#define LOGW(...) LOGV(ORTP_WARNING, __VA_ARGS__)
#define LOGE(...) LOGV(ORTP_ERROR, __VA_ARGS__)
#define LOGF(...) LOGV(ORTP_FATAL, __VA_ARGS__)
@interface Log : NSObject {
}
+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ...;
+ (void)enableLogs:(BOOL)enabled;
+ (void)enableLogs:(OrtpLogLevel)level;
void linphone_iphone_log_handler(int lev, const char *fmt, va_list args);
void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args);
@end

View file

@ -303,12 +303,6 @@ static RootViewManager *rootViewManagerInstance = nil;
LinphoneCallState state = [[notif.userInfo objectForKey:@"state"] intValue];
NSString *message = [notif.userInfo objectForKey:@"message"];
// Don't handle call state during incoming call view
if ([[self currentView] equal:CallIncomingView.compositeViewDescription] && state != LinphoneCallError &&
state != LinphoneCallEnd) {
return;
}
switch (state) {
case LinphoneCallIncomingReceived:
case LinphoneCallIncomingEarlyMedia: {
@ -399,18 +393,16 @@ static RootViewManager *rootViewManagerInstance = nil;
}
}
- (void)startUp {
LinphoneCore *core = nil;
@try {
core = LC;
LinphoneManager *lm = LinphoneManager.instance;
if (linphone_core_get_global_state(core) != LinphoneGlobalOn) {
if (linphone_core_get_global_state(LC) != LinphoneGlobalOn) {
[self changeCurrentView:DialerView.compositeViewDescription];
} else if ([LinphoneManager.instance lpConfigBoolForKey:@"enable_first_login_view_preference"] == true) {
[PhoneMainView.instance changeCurrentView:FirstLoginView.compositeViewDescription];
} else {
// always start to dialer when testing
// Change to default view
const MSList *list = linphone_core_get_proxy_config_list(core);
const MSList *list = linphone_core_get_proxy_config_list(LC);
if (list != NULL || ([lm lpConfigBoolForKey:@"hide_assistant_preference"] == true) || lm.isTesting) {
[self changeCurrentView:DialerView.compositeViewDescription];
} else {

View file

@ -19,6 +19,7 @@
#import "SettingsView.h"
#import "LinphoneManager.h"
#import "LinphoneAppDelegate.h"
#import "PhoneMainView.h"
#import "Utils.h"
@ -282,28 +283,31 @@ INIT_WITH_COMMON_CF {
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
// when device is slow and you are typing an item too much, a crash may happen
// because we try to push the same view multiple times - in that case we should
// do nothing but wait for device to respond again.
if (self.navigationController.topViewController == viewController) {
return;
@try {
[UINavigationControllerEx removeBackground:viewController.view];
[viewController view]; // Force view
UILabel *labelTitleView = [[UILabel alloc] init];
labelTitleView.backgroundColor = [UIColor clearColor];
labelTitleView.textColor =
[UIColor colorWithRed:0x41 / 255.0f green:0x48 / 255.0f blue:0x4f / 255.0f alpha:1.0];
labelTitleView.shadowColor = [UIColor colorWithWhite:1.0 alpha:0.5];
labelTitleView.font = [UIFont boldSystemFontOfSize:20];
labelTitleView.shadowOffset = CGSizeMake(0, 1);
labelTitleView.textAlignment = NSTextAlignmentCenter;
labelTitleView.text = viewController.title;
[labelTitleView sizeToFit];
viewController.navigationItem.titleView = labelTitleView;
[super pushViewController:viewController animated:animated];
} @catch (NSException *e) {
// when device is slow and you are typing an item too much, a crash may happen
// because we try to push the same view multiple times - in that case we should
// do nothing but wait for device to respond again.
LOGI(@"Failed to push view because it's already there: %@", e.reason);
[self popToViewController:viewController animated:YES];
}
[UINavigationControllerEx removeBackground:viewController.view];
[viewController view]; // Force view
UILabel *labelTitleView = [[UILabel alloc] init];
labelTitleView.backgroundColor = [UIColor clearColor];
labelTitleView.textColor = [UIColor colorWithRed:0x41 / 255.0f green:0x48 / 255.0f blue:0x4f / 255.0f alpha:1.0];
labelTitleView.shadowColor = [UIColor colorWithWhite:1.0 alpha:0.5];
labelTitleView.font = [UIFont boldSystemFontOfSize:20];
labelTitleView.shadowOffset = CGSizeMake(0, 1);
labelTitleView.textAlignment = NSTextAlignmentCenter;
labelTitleView.text = viewController.title;
[labelTitleView sizeToFit];
viewController.navigationItem.titleView = labelTitleView;
[super pushViewController:viewController animated:animated];
}
- (void)setViewControllers:(NSArray *)viewControllers {
@ -410,12 +414,13 @@ static UICompositeViewDescription *compositeDescription = nil;
removeFromHiddenKeys = (stun_server && ([stun_server length] > 0));
[keys addObject:@"ice_preference"];
} else if ([@"debugenable_preference" compare:notif.object] == NSOrderedSame) {
BOOL debugEnabled = [[notif.userInfo objectForKey:@"debugenable_preference"] boolValue];
int debugLevel = [[notif.userInfo objectForKey:@"debugenable_preference"] intValue];
BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR);
removeFromHiddenKeys = debugEnabled;
[keys addObject:@"send_logs_button"];
[keys addObject:@"reset_logs_button"];
[Log enableLogs:debugEnabled];
[LinphoneManager.instance lpConfigSetBool:debugEnabled forKey:@"debugenable_preference"];
[Log enableLogs:debugLevel];
[LinphoneManager.instance lpConfigSetInt:debugLevel forKey:@"debugenable_preference"];
} else if ([@"account_mandatory_advanced_preference" compare:notif.object] == NSOrderedSame) {
removeFromHiddenKeys = [[notif.userInfo objectForKey:@"account_mandatory_advanced_preference"] boolValue];
for (NSString *key in settingsStore->dict) {
@ -428,6 +433,11 @@ static UICompositeViewDescription *compositeDescription = nil;
removeFromHiddenKeys = [video_preset isEqualToString:@"custom"];
[keys addObject:@"video_preferred_fps_preference"];
[keys addObject:@"download_bandwidth_preference"];
} else if ([notif.object isEqualToString:@"show_msg_in_notif"]) {
// we have to register again to the iOS notification, because we change the actions associated with IM_MSG
UIApplication *app = [UIApplication sharedApplication];
LinphoneAppDelegate *delegate = (LinphoneAppDelegate *)app.delegate;
[delegate registerForNotifications:app];
}
for (NSString *key in keys) {
@ -521,7 +531,9 @@ static UICompositeViewDescription *compositeDescription = nil;
[hiddenKeys addObject:@"flush_images_button"];
#endif
if (![LinphoneManager.instance lpConfigBoolForKey:@"debugenable_preference"]) {
int debugLevel = [LinphoneManager.instance lpConfigIntForKey:@"debugenable_preference"];
BOOL debugEnabled = (debugLevel >= ORTP_DEBUG && debugLevel < ORTP_ERROR);
if (!debugEnabled) {
[hiddenKeys addObject:@"send_logs_button"];
[hiddenKeys addObject:@"reset_logs_button"];
}
@ -752,6 +764,7 @@ static UICompositeViewDescription *compositeDescription = nil;
[attachments addObject:@[ [NSString stringWithUTF8String:filepath], mimeType, filename ]];
}
}
ms_free(filepath);
if ([LinphoneManager.instance lpConfigBoolForKey:@"send_logs_include_linphonerc_and_chathistory"]) {
// retrieve linphone rc
@ -766,8 +779,16 @@ static UICompositeViewDescription *compositeDescription = nil;
]];
}
if (attachments.count == 0) {
DTAlertView *alert = [[DTAlertView alloc]
initWithTitle:NSLocalizedString(@"Cannot send logs", nil)
message:NSLocalizedString(@"Nothing could be collected from your application, aborting now.", nil)];
[alert addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil];
[alert show];
return;
}
[self emailAttachments:attachments];
ms_free(filepath);
}
- (void)emailAttachments:(NSArray *)attachments {
NSString *error = nil;
@ -792,11 +813,13 @@ static UICompositeViewDescription *compositeDescription = nil;
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker setSubject:@"<Please describe your problem>"];
[picker setSubject:NSLocalizedString(@"<Please describe your problem or you will be ignored>",
@"Email title for people wanting to send a bug report")];
[picker setToRecipients:[NSArray arrayWithObjects:@"linphone-iphone@belledonne-communications.com", nil]];
[picker setMessageBody:@"Here are information about an issue I had on my device.\nI was "
@"doing ...\nI expected Linphone to ...\nInstead, I got an "
@"unexpected result: ..."
[picker setMessageBody:NSLocalizedString(@"Here are information about an issue I had on my device.\nI was "
@"doing ...\nI expected Linphone to ...\nInstead, I got an "
@"unexpected result: ...",
@"Template email for people wanting to send a bug report")
isHTML:NO];
for (NSArray *attachment in attachments) {
if ([[NSFileManager defaultManager] fileExistsAtPath:attachment[0]]) {

View file

@ -73,7 +73,12 @@
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] init];
if (indexPath.section == 0) {
LinphoneProxyConfig *proxy = ms_list_nth_data(linphone_core_get_proxy_config_list(LC), (int)indexPath.row);
// do not display default account here, it is already in header view
int idx = linphone_core_get_default_proxy_config(LC) ? ms_list_index(linphone_core_get_proxy_config_list(LC),
linphone_core_get_default_proxy_config(LC))
: 0;
LinphoneProxyConfig *proxy = ms_list_nth_data(linphone_core_get_proxy_config_list(LC),
(int)indexPath.row + (idx <= indexPath.row ? 1 : 0));
if (proxy) {
cell.textLabel.text = [NSString stringWithUTF8String:linphone_proxy_config_get_identity(proxy)];
cell.imageView.image = [StatusBarView imageForState:linphone_proxy_config_get_state(proxy)];

View file

@ -21,73 +21,83 @@
@implementation Log
#define FILE_SIZE 17
#define DOMAIN_SIZE 3
+ (NSString *)cacheDirectory {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
// cache directory must be created if not existing
if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
[[NSFileManager defaultManager] createDirectoryAtPath:cachePath
withIntermediateDirectories:NO
attributes:nil
error:&error];
}
return cachePath;
}
+ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
const char *utf8str = [str cStringUsingEncoding:NSString.defaultCStringEncoding];
int filesize = 20;
const char *filename = strchr(file, '/') ? strrchr(file, '/') + 1 : file;
char levelC = 'U'; // undefined
if ((severity & ORTP_FATAL) != 0) {
levelC = 'F';
} else if ((severity & ORTP_ERROR) != 0) {
levelC = 'E';
} else if ((severity & ORTP_WARNING) != 0) {
levelC = 'W';
} else if ((severity & ORTP_MESSAGE) != 0) {
levelC = 'I';
} else if ((severity & ORTP_DEBUG) != 0) {
levelC = 'D';
}
if ((severity & ORTP_DEBUG) != 0) {
// lol: ortp_debug(XXX) can be disabled at compile time, but ortp_log(ORTP_DEBUG, xxx) will always be valid even
// not in debug build...
ortp_debug("%c %*s:%3d - %s", levelC, filesize, filename + MAX((int)strlen(filename) - filesize, 0), line,
utf8str);
} else {
// we want application logs to be always enabled (except debug ones) so use | ORTP_ERROR extra mask
ortp_log(severity | ORTP_ERROR, "%c %*s:%3d - %s", levelC, filesize,
filename + MAX((int)strlen(filename) - filesize, 0), line, utf8str);
}
ortp_log(severity, "(%*s:%-4d) %s", FILE_SIZE, filename + MAX((int)strlen(filename) - FILE_SIZE, 0), line, utf8str);
va_end(args);
}
+ (void)enableLogs:(BOOL)enabled {
linphone_core_enable_logs_with_cb((OrtpLogFunc)linphone_iphone_log_handler);
if (enabled) {
NSLog(@"Enabling debug logs");
linphone_core_set_log_level(ORTP_DEBUG);
} else {
NSLog(@"Disabling debug logs");
linphone_core_set_log_level(ORTP_ERROR);
}
+ (void)enableLogs:(OrtpLogLevel)level {
BOOL enabled = (level >= ORTP_DEBUG && level < ORTP_ERROR);
linphone_core_set_log_collection_path([self cacheDirectory].UTF8String);
linphone_core_enable_logs_with_cb(linphone_iphone_log_handler);
linphone_core_enable_log_collection(enabled);
if (level == 0) {
linphone_core_set_log_level(ORTP_FATAL);
ortp_set_log_level("ios", ORTP_FATAL);
NSLog(@"I/%s/Disabling all logs", ORTP_LOG_DOMAIN);
} else {
NSLog(@"I/%s/Enabling %s logs", ORTP_LOG_DOMAIN, (enabled ? "all" : "application only"));
linphone_core_set_log_level(level);
ortp_set_log_level("ios", level == ORTP_DEBUG ? ORTP_DEBUG : ORTP_MESSAGE);
}
}
#pragma mark - Logs Functions callbacks
void linphone_iphone_log_handler(int lev, const char *fmt, va_list args) {
void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) {
NSString *format = [[NSString alloc] initWithUTF8String:fmt];
NSString *formatedString = [[NSString alloc] initWithFormat:format arguments:args];
NSString *lvl = @"";
if ((lev & APP_LVL) == 0) {
if ((lev & ORTP_FATAL) != 0) {
lvl = @"F ";
} else if ((lev & ORTP_ERROR) != 0) {
lvl = @"E ";
} else if ((lev & ORTP_WARNING) != 0) {
lvl = @"W ";
} else if ((lev & ORTP_MESSAGE) != 0) {
lvl = @"I ";
} else if (((lev & ORTP_TRACE) != 0) || ((lev & ORTP_DEBUG) != 0)) {
lvl = @"D ";
}
switch (lev) {
case ORTP_FATAL:
lvl = @"F";
break;
case ORTP_ERROR:
lvl = @"E";
break;
case ORTP_WARNING:
lvl = @"W";
break;
case ORTP_MESSAGE:
lvl = @"I";
break;
case ORTP_DEBUG:
case ORTP_TRACE:
lvl = @"D";
break;
case ORTP_LOGLEV_END:
return;
}
if (!domain)
domain = "liblinphone";
// since \r are interpreted like \n, avoid double new lines when logging network packets (belle-sip)
NSLog(@"%@%@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
// output format is like: I/ios/some logs. We truncate domain to **exactly** DOMAIN_SIZE characters to have
// fixed-length aligned logs
NSLog(@"%@/%*.*s/%@", lvl, DOMAIN_SIZE, DOMAIN_SIZE, domain,
[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
}
@end

View file

@ -100,21 +100,15 @@ typedef enum {
whatever is using it (xib, source code, etc., tableview cell) */
#define INIT_WITH_COMMON_C \
-(instancetype)init { \
self = [super init]; \
[self commonInit]; \
return self; \
return [[super init] commonInit]; \
} \
-(instancetype)initWithCoder : (NSCoder *)aDecoder { \
self = [super initWithCoder:aDecoder]; \
[self commonInit]; \
return self; \
return [[super initWithCoder:aDecoder] commonInit]; \
} \
-(instancetype)commonInit
#define INIT_WITH_COMMON_CF \
-(instancetype)initWithFrame : (CGRect)frame { \
self = [super initWithFrame:frame]; \
[self commonInit]; \
return self; \
return [[super initWithFrame:frame] commonInit]; \
} \
INIT_WITH_COMMON_C

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="H1p-Uh-vWS">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch.iPad" propertyAccessControl="none" useAutolayout="YES" initialViewController="H1p-Uh-vWS">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
@ -22,13 +23,13 @@
<!--Detail-->
<scene sceneID="yUG-lL-AsK">
<objects>
<viewController title="Detail" id="JEX-9P-axG" customClass="DetailView" sceneMemberID="viewController">
<viewController title="Detail" id="JEX-9P-axG" customClass="DetailTableView" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="aVY-Yw-ztG">
<rect key="frame" x="0.0" y="0.0" width="703" height="768"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" textLabel="6lf-XI-z9S" style="IBUITableViewCellStyleDefault" id="fGk-UB-StR">
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" reuseIdentifier="testCellIdentifier" textLabel="6lf-XI-z9S" style="IBUITableViewCellStyleDefault" id="fGk-UB-StR">
<rect key="frame" x="0.0" y="86" width="703" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fGk-UB-StR" id="oMv-Vp-OY1">
@ -36,7 +37,7 @@
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6lf-XI-z9S">
<rect key="frame" x="15" y="0.0" width="673" height="43"/>
<rect key="frame" x="35" y="0.0" width="633" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
@ -46,6 +47,7 @@
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<sections/>
</tableView>
<toolbarItems/>
<navigationItem key="navigationItem" title="Detail" id="mOI-FS-AaM"/>
@ -125,9 +127,4 @@
<point key="canvasLocation" x="-366" y="248"/>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination"/>
</simulatedMetricsContainer>
</document>

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="rS3-R9-Ivy">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9531" systemVersion="15C50" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="rS3-R9-Ivy">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9529"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
@ -65,7 +66,7 @@
<!--Detail-->
<scene sceneID="Cn3-H9-jdl">
<objects>
<viewController title="Detail" id="Ah7-4n-0Wa" customClass="DetailView" sceneMemberID="viewController">
<viewController title="Detail" id="Ah7-4n-0Wa" customClass="DetailTableView" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="HbK-cV-Nw3">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -97,9 +98,4 @@
<point key="canvasLocation" x="1002" y="78"/>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>

View file

@ -21,7 +21,7 @@ typedef NS_ENUM(int, TestState) { TestStateIdle, TestStatePassed, TestStateInPro
@end
@interface DetailView : UITableViewController
@interface DetailTableView : UITableViewController
@property(strong, nonatomic) NSString *detailItem;

View file

@ -6,7 +6,7 @@
//
//
#import "DetailView.h"
#import "DetailTableView.h"
#import "MasterView.h"
#import "LogsView.h"
#include "linphone/liblinphone_tester.h"
@ -36,7 +36,7 @@ static NSString *const kAllTestsName = @"Run All tests";
@end
@interface DetailView () {
@interface DetailTableView () {
NSMutableArray *_tests;
BOOL in_progress;
}
@ -44,7 +44,7 @@ static NSString *const kAllTestsName = @"Run All tests";
- (void)configureView;
@end
@implementation DetailView
@implementation DetailTableView
#pragma mark - Managing the detail item
@ -113,7 +113,11 @@ static NSString *const kAllTestsName = @"Run All tests";
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"testCellIdentifier" forIndexPath:indexPath];
static NSString *kCellId = @"testCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellId forIndexPath:indexPath];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellId];
}
TestItem *test = _tests[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@/%@", test.suite, test.name];

View file

@ -36,6 +36,8 @@
<array>
<string>armv7</string>
</array>
<key>UIRequiresFullScreen</key>
<true/>
<key>UIStatusBarTintParameters</key>
<dict>
<key>UINavigationBar</key>

View file

@ -11,10 +11,10 @@
extern NSMutableArray *lastLogs;
extern NSString *const kLogsUpdateNotification;
@class DetailView;
@class DetailTableView;
@interface MasterView : UITableViewController
@property(strong, nonatomic) DetailView *detailViewController;
@property(strong, nonatomic) DetailTableView *detailViewController;
@end

View file

@ -8,7 +8,7 @@
#import "MasterView.h"
#import "LogsView.h"
#import "DetailView.h"
#import "DetailTableView.h"
#include "linphone/liblinphone_tester.h"
#include "mediastreamer2/msutils.h"
@ -40,15 +40,18 @@ NSString *const kLogsUpdateNotification = @"kLogsUpdateNotification";
- (void)setupLogging {
lastLogs = [[NSMutableArray alloc] initWithCapacity:kLastLogsCapacity];
logsBuffer = [NSMutableArray arrayWithCapacity:kLogsBufferCapacity];
[Log enableLogs:ORTP_DEBUG];
}
linphone_core_set_log_level(ORTP_MESSAGE);
linphone_core_set_log_handler((OrtpLogFunc)linphone_iphone_log_handler);
void tester_logs_handler(int level, const char *fmt, va_list args) {
linphone_iphone_log_handler(NULL, level, fmt, args);
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.detailViewController = (DetailView *)[[self.splitViewController.viewControllers lastObject] topViewController];
self.detailViewController =
(DetailTableView *)[[self.splitViewController.viewControllers lastObject] topViewController];
[self setupLogging];
@ -56,7 +59,7 @@ NSString *const kLogsUpdateNotification = @"kLogsUpdateNotification";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
documentPath = [paths objectAtIndex:0];
bc_tester_init((void (*)(int, const char *fm, va_list))linphone_iphone_log_handler, ORTP_MESSAGE, ORTP_ERROR);
bc_tester_init(tester_logs_handler, ORTP_MESSAGE, ORTP_ERROR);
liblinphone_tester_add_suites();
bc_tester_set_resource_dir_prefix([bundlePath UTF8String]);

View file

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -10,11 +10,21 @@
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "57x57",
@ -84,6 +94,11 @@
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
}
],
"info" : {

View file

@ -1,89 +0,0 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "1x",
"orientation" : "portrait"
},
{
"idiom" : "iphone",
"scale" : "2x",
"orientation" : "portrait"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"subtype" : "retina4",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"minimum-system-version" : "7.0",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"minimum-system-version" : "7.0",
"subtype" : "retina4",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "to-status-bar",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"minimum-system-version" : "7.0",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"minimum-system-version" : "7.0",
"extent" : "full-screen",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"minimum-system-version" : "7.0",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"minimum-system-version" : "7.0",
"extent" : "full-screen",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -7,93 +7,23 @@
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#include <execinfo.h>
#include <signal.h>
static NSString *const kKEY_CRASH_REPORT = @"CRASH_REPORT";
static NSString *const kKEY_ExceptionName = @"UnhandledExceptionName";
static NSString *const kKEY_ExceptionReason = @"UnhandledExceptionReason";
static NSString *const kKEY_ExceptionUserInfo = @"UnhandledExceptionUserInfo";
static NSString *const kKEY_ExceptionCallStack = @"UnhandledExceptionCallStack";
static NSString *const kKEY_ExceptionScreenshot = @"UnhandledExceptionScreenshot";
static NSString *const kKEY_ExceptionTimestamp = @"UnhandledExceptionTimestamp";
#ifdef DEBUG
static void unhandledExceptionHandler(NSException *exception) {
NSMutableDictionary *crashReport = [NSMutableDictionary dictionary];
crashReport[kKEY_ExceptionName] = exception.name;
crashReport[kKEY_ExceptionReason] = exception.reason;
crashReport[kKEY_ExceptionUserInfo] = exception.userInfo ?: [NSNull null].debugDescription;
crashReport[kKEY_ExceptionCallStack] = exception.callStackSymbols.debugDescription;
// Dump exception
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"Crash: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
};
NSLog(@"CRASH: %@ - %@", exception.name, exception.callStackSymbols.debugDescription);
[[NSUserDefaults standardUserDefaults] setObject:[NSDictionary dictionaryWithDictionary:crashReport]
forKey:kKEY_CRASH_REPORT];
[[NSUserDefaults standardUserDefaults] synchronize];
exit(1);
}
/* SignalHandler
*
* Handle uncaught signals
*/
void SignalHandler(int sig, siginfo_t *info, void *context) {
void *frames[128];
int i, len = backtrace(frames, 128);
char **symbols = backtrace_symbols(frames, len);
/*
* Now format into a message for sending to the user
*/
NSMutableString *buffer = [[NSMutableString alloc] initWithCapacity:4096];
NSBundle *bundle = [NSBundle mainBundle];
[buffer appendFormat:@"PComp version %@ build %@\n\n", [bundle objectForInfoDictionaryKey:@"CFBundleVersion"],
[bundle objectForInfoDictionaryKey:@"CIMBuildNumber"]];
[buffer appendString:@"Uncaught Signal\n"];
[buffer appendFormat:@"si_signo %d\n", info->si_signo];
[buffer appendFormat:@"si_code %d\n", info->si_code];
[buffer appendFormat:@"si_value %d\n", info->si_value.sival_int];
[buffer appendFormat:@"si_errno %d\n", info->si_errno];
[buffer appendFormat:@"si_addr %p\n", info->si_addr];
[buffer appendFormat:@"si_status %d\n", info->si_status];
[buffer appendString:@"Stack trace:\n\n"];
for (i = 0; i < len; ++i) {
[buffer appendFormat:@"%4d - %s\n", i, symbols[i]];
}
/*
* Get the error file to write this to
*/
NSLog(@"Error %@", buffer);
exit(1);
}
void InstallUncaughtExceptionHandler() {
NSSetUncaughtExceptionHandler(&unhandledExceptionHandler);
struct sigaction mySigAction;
mySigAction.sa_sigaction = SignalHandler;
mySigAction.sa_flags = SA_SIGINFO;
sigemptyset(&mySigAction.sa_mask);
sigaction(SIGQUIT, &mySigAction, NULL);
sigaction(SIGILL, &mySigAction, NULL);
sigaction(SIGTRAP, &mySigAction, NULL);
sigaction(SIGABRT, &mySigAction, NULL);
sigaction(SIGEMT, &mySigAction, NULL);
sigaction(SIGFPE, &mySigAction, NULL);
sigaction(SIGBUS, &mySigAction, NULL);
sigaction(SIGSEGV, &mySigAction, NULL);
sigaction(SIGSYS, &mySigAction, NULL);
}
#endif
int main(int argc, char *argv[]) {
InstallUncaughtExceptionHandler();
#ifdef DEBUG
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -3,7 +3,7 @@
{
"orientation" : "portrait",
"idiom" : "iphone",
"filename" : "linphone_splashscreen@2x.png",
"filename" : "linphone-640x960.png",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
@ -12,7 +12,7 @@
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "retina4",
"filename" : "linphone_splashscreen-568h@2x.png",
"filename" : "linphone-640x1136.png",
"minimum-system-version" : "7.0",
"orientation" : "portrait",
"scale" : "2x"
@ -20,7 +20,7 @@
{
"orientation" : "portrait",
"idiom" : "ipad",
"filename" : "linphone_splashscreen~ipad.png",
"filename" : "linphone-768x1024.png",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "1x"
@ -28,7 +28,7 @@
{
"orientation" : "landscape",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Landscape~ipad.png",
"filename" : "linphone-1024x768.png",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "1x"
@ -36,7 +36,7 @@
{
"orientation" : "portrait",
"idiom" : "ipad",
"filename" : "linphone_splashscreen~ipad@2x.png",
"filename" : "linphone-1536x2048.png",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
@ -44,7 +44,7 @@
{
"orientation" : "landscape",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Landscape~ipad@2x.png",
"filename" : "linphone-2048x1536.png",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"scale" : "2x"
@ -52,21 +52,21 @@
{
"orientation" : "portrait",
"idiom" : "iphone",
"filename" : "linphone_splashscreen.png",
"filename" : "linphone-320x480.png",
"extent" : "full-screen",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"filename" : "linphone_splashscreen@2x.png",
"filename" : "linphone-640x960.png",
"extent" : "full-screen",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"filename" : "linphone_splashscreen-568h@2x.png",
"filename" : "linphone-640x1136.png",
"extent" : "full-screen",
"subtype" : "retina4",
"scale" : "2x"
@ -74,28 +74,28 @@
{
"orientation" : "portrait",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Portrait.png",
"filename" : "linphone-768x1004.png",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Landscape.png",
"filename" : "linphone-1024x748.png",
"extent" : "to-status-bar",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Portrait@2x.png",
"filename" : "linphone-1536x2008.png",
"extent" : "to-status-bar",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"filename" : "linphone_splashscreen-Landscape@2x.png",
"filename" : "linphone-2048x1496.png",
"extent" : "to-status-bar",
"scale" : "2x"
}

Some files were not shown because too many files have changed in this diff Show more