Merge branch 'master' into dev_vcard
1
.gitignore
vendored
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -8,9 +8,8 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface CallConferenceTableView : UITableViewController {
|
||||
@private
|
||||
NSTimer *updateTime;
|
||||
}
|
||||
@interface CallConferenceTableView : UITableViewController
|
||||
|
||||
- (void)update;
|
||||
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,9 +19,8 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface CallPausedTableView : UITableViewController {
|
||||
@private
|
||||
NSTimer *updateTime;
|
||||
}
|
||||
@interface CallPausedTableView : UITableViewController
|
||||
|
||||
- (void)update;
|
||||
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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]];
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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>
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
}
|
||||
|
||||
- (void)processRemoteNotification:(NSDictionary*)userInfo;
|
||||
- (void)registerForNotifications:(UIApplication *)app;
|
||||
|
||||
@property (nonatomic, retain) UIAlertView *waitingIndicator;
|
||||
@property (nonatomic, retain) NSString *configURL;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -26,6 +26,6 @@
|
|||
|
||||
@property(nonatomic, strong) IBOutlet UITextField *addressField;
|
||||
|
||||
- (void)updateVideoPolicy;
|
||||
- (void)updateIcon;
|
||||
|
||||
@end
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@
|
|||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
|
||||
- (void)touchUp:(id)sender {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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]]) {
|
||||
|
|
|
|||
|
|
@ -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)];
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ typedef NS_ENUM(int, TestState) { TestStateIdle, TestStatePassed, TestStateInPro
|
|||
|
||||
@end
|
||||
|
||||
@interface DetailView : UITableViewController
|
||||
@interface DetailTableView : UITableViewController
|
||||
|
||||
@property(strong, nonatomic) NSString *detailItem;
|
||||
|
||||
|
|
@ -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];
|
||||
|
|
@ -36,6 +36,8 @@
|
|||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
<key>UIRequiresFullScreen</key>
|
||||
<true/>
|
||||
<key>UIStatusBarTintParameters</key>
|
||||
<dict>
|
||||
<key>UINavigationBar</key>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
6
LiblinphoneTester/TesterImages.xcassets/Contents.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
||||
|
|
@ -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" : {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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]));
|
||||
}
|
||||
|
|
|
|||
BIN
LiblinphoneTester/test_failed.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
LiblinphoneTester/test_inprogress.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
LiblinphoneTester/test_passed.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -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"
|
||||
}
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |