From 4a51bee890d3f6d009accb0ea9f059e25059fc32 Mon Sep 17 00:00:00 2001 From: QuentinArguillere Date: Fri, 31 Jul 2020 16:10:06 +0200 Subject: [PATCH] Copied from HelloLinphone all code related to the Call tutorials --- .gitignore | 12 +- .../CallTutorial.xcodeproj/project.pbxproj | 421 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 10077 bytes .../xcschemes/xcschememanagement.plist | 14 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 25980 bytes .../CallTutorial/AppDelegate.swift | 37 ++ .../AppIcon.appiconset/Contents.json | 98 ++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../CallTutorial/CallExample.swift | 170 +++++++ .../CallTutorial/ContentView.swift | 102 +++++ swift/CallTutorial/CallTutorial/Info.plist | 66 +++ .../Preview Assets.xcassets/Contents.json | 6 + .../CallTutorial/SceneDelegate.swift | 64 +++ swift/CallTutorial/Podfile | 24 + 19 files changed, 1072 insertions(+), 6 deletions(-) create mode 100644 swift/CallTutorial/CallTutorial.xcodeproj/project.pbxproj create mode 100644 swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 swift/CallTutorial/CallTutorial.xcodeproj/xcuserdata/QuentinA.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 swift/CallTutorial/CallTutorial.xcworkspace/contents.xcworkspacedata create mode 100644 swift/CallTutorial/CallTutorial.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 swift/CallTutorial/CallTutorial.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 swift/CallTutorial/CallTutorial/AppDelegate.swift create mode 100644 swift/CallTutorial/CallTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 swift/CallTutorial/CallTutorial/Assets.xcassets/Contents.json create mode 100644 swift/CallTutorial/CallTutorial/Base.lproj/LaunchScreen.storyboard create mode 100644 swift/CallTutorial/CallTutorial/CallExample.swift create mode 100644 swift/CallTutorial/CallTutorial/ContentView.swift create mode 100644 swift/CallTutorial/CallTutorial/Info.plist create mode 100644 swift/CallTutorial/CallTutorial/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 swift/CallTutorial/CallTutorial/SceneDelegate.swift create mode 100644 swift/CallTutorial/Podfile diff --git a/.gitignore b/.gitignore index 078d832..4dacb80 100644 --- a/.gitignore +++ b/.gitignore @@ -7,13 +7,13 @@ java/.idea/modules.xml java/.idea/workspace.xml java/.idea/navEditor.xml java/.idea/assetWizardSettings.xml -java/.DS_Store +.DS_Store java/build java/captures java/.externalNativeBuild java/.cxx -swift/HelloLinphone/Podfile.lock -swift/HelloLinphone/Pods/ -swift/HelloLinphone/HelloLinphone.xcodeproj/project.xcworkspace/xcuserdata/ -swift/HelloLinphone/HelloLinphone.xcodeproj/xcuserdata/ -swift/HelloLinphone/HelloLinphone.xcworkspace/xcuserdata/ +swift/*/Podfile.lock +swift/*/Pods/ +swift/*/HelloLinphone.xcodeproj/project.xcworkspace/xcuserdata/ +swift/*/HelloLinphone.xcodeproj/xcuserdata/ +swift/*/HelloLinphone.xcworkspace/xcuserdata/ diff --git a/swift/CallTutorial/CallTutorial.xcodeproj/project.pbxproj b/swift/CallTutorial/CallTutorial.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ebb5e65 --- /dev/null +++ b/swift/CallTutorial/CallTutorial.xcodeproj/project.pbxproj @@ -0,0 +1,421 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 6604165724D451F10064FC6C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6604165624D451F10064FC6C /* AppDelegate.swift */; }; + 6604165924D451F10064FC6C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6604165824D451F10064FC6C /* SceneDelegate.swift */; }; + 6604165B24D451F10064FC6C /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6604165A24D451F10064FC6C /* ContentView.swift */; }; + 6604165D24D451F40064FC6C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6604165C24D451F40064FC6C /* Assets.xcassets */; }; + 6604166024D451F40064FC6C /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6604165F24D451F40064FC6C /* Preview Assets.xcassets */; }; + 6604166324D451F40064FC6C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6604166124D451F40064FC6C /* LaunchScreen.storyboard */; }; + 6604166B24D453240064FC6C /* CallExample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6604166A24D453240064FC6C /* CallExample.swift */; }; + E1569C6E0564D0FD3FF9B4AF /* Pods_CallTutorial.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DC1D5CBF786F45B5E0D811F /* Pods_CallTutorial.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1DC1D5CBF786F45B5E0D811F /* Pods_CallTutorial.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CallTutorial.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6604165324D451F10064FC6C /* CallTutorial.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CallTutorial.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6604165624D451F10064FC6C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6604165824D451F10064FC6C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 6604165A24D451F10064FC6C /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 6604165C24D451F40064FC6C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6604165F24D451F40064FC6C /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 6604166224D451F40064FC6C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 6604166424D451F40064FC6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6604166A24D453240064FC6C /* CallExample.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallExample.swift; sourceTree = ""; }; + 79CE65CD0070AF94E21BFCE7 /* Pods-CallTutorial.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallTutorial.debug.xcconfig"; path = "Target Support Files/Pods-CallTutorial/Pods-CallTutorial.debug.xcconfig"; sourceTree = ""; }; + C26219FCE26251F1C3C2E96E /* Pods-CallTutorial.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CallTutorial.release.xcconfig"; path = "Target Support Files/Pods-CallTutorial/Pods-CallTutorial.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6604165024D451F10064FC6C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1569C6E0564D0FD3FF9B4AF /* Pods_CallTutorial.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 45BF82DCB7DE5ABEFF54FFB8 /* Pods */ = { + isa = PBXGroup; + children = ( + 79CE65CD0070AF94E21BFCE7 /* Pods-CallTutorial.debug.xcconfig */, + C26219FCE26251F1C3C2E96E /* Pods-CallTutorial.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 5AB8CB6ACCE63B169851E447 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1DC1D5CBF786F45B5E0D811F /* Pods_CallTutorial.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6604164A24D451F10064FC6C = { + isa = PBXGroup; + children = ( + 6604165524D451F10064FC6C /* CallTutorial */, + 6604165424D451F10064FC6C /* Products */, + 45BF82DCB7DE5ABEFF54FFB8 /* Pods */, + 5AB8CB6ACCE63B169851E447 /* Frameworks */, + ); + sourceTree = ""; + }; + 6604165424D451F10064FC6C /* Products */ = { + isa = PBXGroup; + children = ( + 6604165324D451F10064FC6C /* CallTutorial.app */, + ); + name = Products; + sourceTree = ""; + }; + 6604165524D451F10064FC6C /* CallTutorial */ = { + isa = PBXGroup; + children = ( + 6604165624D451F10064FC6C /* AppDelegate.swift */, + 6604165824D451F10064FC6C /* SceneDelegate.swift */, + 6604165A24D451F10064FC6C /* ContentView.swift */, + 6604165C24D451F40064FC6C /* Assets.xcassets */, + 6604166124D451F40064FC6C /* LaunchScreen.storyboard */, + 6604166424D451F40064FC6C /* Info.plist */, + 6604166A24D453240064FC6C /* CallExample.swift */, + 6604165E24D451F40064FC6C /* Preview Content */, + ); + path = CallTutorial; + sourceTree = ""; + }; + 6604165E24D451F40064FC6C /* Preview Content */ = { + isa = PBXGroup; + children = ( + 6604165F24D451F40064FC6C /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6604165224D451F10064FC6C /* CallTutorial */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6604166724D451F40064FC6C /* Build configuration list for PBXNativeTarget "CallTutorial" */; + buildPhases = ( + 5CB594802811F76FF54C79AA /* [CP] Check Pods Manifest.lock */, + 6604164F24D451F10064FC6C /* Sources */, + 6604165024D451F10064FC6C /* Frameworks */, + 6604165124D451F10064FC6C /* Resources */, + 01F8A055DBD8B3D5345AD62E /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CallTutorial; + productName = CallTutorial; + productReference = 6604165324D451F10064FC6C /* CallTutorial.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6604164B24D451F10064FC6C /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1150; + LastUpgradeCheck = 1150; + ORGANIZATIONNAME = BelledonneCommunications; + TargetAttributes = { + 6604165224D451F10064FC6C = { + CreatedOnToolsVersion = 11.5; + }; + }; + }; + buildConfigurationList = 6604164E24D451F10064FC6C /* Build configuration list for PBXProject "CallTutorial" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 6604164A24D451F10064FC6C; + productRefGroup = 6604165424D451F10064FC6C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6604165224D451F10064FC6C /* CallTutorial */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6604165124D451F10064FC6C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6604166324D451F40064FC6C /* LaunchScreen.storyboard in Resources */, + 6604166024D451F40064FC6C /* Preview Assets.xcassets in Resources */, + 6604165D24D451F40064FC6C /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 01F8A055DBD8B3D5345AD62E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-CallTutorial/Pods-CallTutorial-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-CallTutorial/Pods-CallTutorial-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CallTutorial/Pods-CallTutorial-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 5CB594802811F76FF54C79AA /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-CallTutorial-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6604164F24D451F10064FC6C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6604166B24D453240064FC6C /* CallExample.swift in Sources */, + 6604165724D451F10064FC6C /* AppDelegate.swift in Sources */, + 6604165924D451F10064FC6C /* SceneDelegate.swift in Sources */, + 6604165B24D451F10064FC6C /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 6604166124D451F40064FC6C /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6604166224D451F40064FC6C /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6604166524D451F40064FC6C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 6604166624D451F40064FC6C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.5; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 6604166824D451F40064FC6C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 79CE65CD0070AF94E21BFCE7 /* Pods-CallTutorial.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"CallTutorial/Preview Content\""; + DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = CallTutorial/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = BC.CallTutorial; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 6604166924D451F40064FC6C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C26219FCE26251F1C3C2E96E /* Pods-CallTutorial.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"CallTutorial/Preview Content\""; + DEVELOPMENT_TEAM = Z2V957B3D6; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = CallTutorial/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = BC.CallTutorial; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6604164E24D451F10064FC6C /* Build configuration list for PBXProject "CallTutorial" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6604166524D451F40064FC6C /* Debug */, + 6604166624D451F40064FC6C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6604166724D451F40064FC6C /* Build configuration list for PBXNativeTarget "CallTutorial" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6604166824D451F40064FC6C /* Debug */, + 6604166924D451F40064FC6C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 6604164B24D451F10064FC6C /* Project object */; +} diff --git a/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e403c8d --- /dev/null +++ b/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate b/swift/CallTutorial/CallTutorial.xcodeproj/project.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..39b9548cb2a772238ff80e85a87a653bfe0a4293 GIT binary patch literal 10077 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 + + + + SchemeUserState + + CallTutorial.xcscheme_^#shared#^_ + + orderHint + 2 + + + + diff --git a/swift/CallTutorial/CallTutorial.xcworkspace/contents.xcworkspacedata b/swift/CallTutorial/CallTutorial.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1a8acfc --- /dev/null +++ b/swift/CallTutorial/CallTutorial.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/swift/CallTutorial/CallTutorial.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/swift/CallTutorial/CallTutorial.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/swift/CallTutorial/CallTutorial.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/swift/CallTutorial/CallTutorial.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate b/swift/CallTutorial/CallTutorial.xcworkspace/xcuserdata/QuentinA.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..64dff2fb0c3c265df9fe7bdb43a47821130d095c GIT binary patch literal 25980 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 X@Z#a*cprW!O8gH;F};3 Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/swift/CallTutorial/CallTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json b/swift/CallTutorial/CallTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/swift/CallTutorial/CallTutorial/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/swift/CallTutorial/CallTutorial/Assets.xcassets/Contents.json b/swift/CallTutorial/CallTutorial/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/swift/CallTutorial/CallTutorial/Base.lproj/LaunchScreen.storyboard b/swift/CallTutorial/CallTutorial/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/swift/CallTutorial/CallTutorial/CallExample.swift b/swift/CallTutorial/CallTutorial/CallExample.swift new file mode 100644 index 0000000..2e1d867 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/CallExample.swift @@ -0,0 +1,170 @@ +// +// CallExample.swift +// CallTutorial +// +// Created by QuentinArguillere on 31/07/2020. +// Copyright © 2020 BelledonneCommunications. All rights reserved. +// + +import linphonesw +import AVFoundation + +class CallExampleContext : ObservableObject +{ + var mCore: Core! // We need a Core for... anything, basically + @Published var coreVersion: String = Core.getVersion + + /*------------ Logs related variables ------------------------*/ + var log : LoggingService? + var logManager : LinphoneLoggingServiceManager? + @Published var logsEnabled : Bool = true + + /*------------ Call tutorial related variables ---------------*/ + let mPhoneStateTracer = LinconePhoneStateTracker() + var mCall: Call! + var mVideoDevices : [String] = [] + var mUsedVideoDeviceId : Int = 0 + + @Published var audioEnabled : Bool = true + @Published var videoEnabled : Bool = false + @Published var speakerEnabled : Bool = false + @Published var callRunning : Bool = false + @Published var dest : String = "sip:arguillq@sip.linphone.org" + + + init() + { + let factory = Factory.Instance // Instanciate + + logManager = LinphoneLoggingServiceManager() + logManager!.tutorialContext = self; + log = LoggingService.Instance + log!.addDelegate(delegate: logManager!) + log!.logLevel = LogLevel.Debug + factory.enableLogCollection(state: LogCollectionState.Enabled) + + // Initialize Linphone Core + try? mCore = factory.createCore(configPath: "", factoryConfigPath: "", systemContext: nil) + + // main loop for receiving notifications and doing background linphonecore work: + mCore.autoIterateEnabled = true + try? mCore.start() + + mVideoDevices = mCore.videoDevicesList + } + + // Initiate a call + func outgoingCallExample() + { + do { + let callParams = try mCore.createCallParams(call: nil) + callParams.videoEnabled = videoEnabled; + callParams.audioEnabled = audioEnabled; + + if (!callRunning) + { + mCore.addDelegate(delegate: mPhoneStateTracer) + + let callDest = try Factory.Instance.createAddress(addr: dest) + // Place an outgoing call + mCall = mCore.inviteAddressWithParams(addr: callDest, params: callParams) + + if (mCall == nil) { + print("Could not place call to \(dest)\n") + } else { + print("Call to \(dest) is in progress...") + callRunning = true + } + } + else + { + try mCall.update(params: callParams) + } + } catch { + print(error) + } + + } + + // Terminate a call + func stopOutgoingCallExample() + { + if (callRunning) + { + callRunning = false + if (mCall.state != Call.State.End){ + // terminate the call + print("Terminating the call...\n") + do { + try mCall.terminate() + } catch { + callRunning = true + print(error) + } + } + mCore.removeDelegate(delegate: self.mPhoneStateTracer) + } + } + + func speaker() + { + speakerEnabled = !speakerEnabled + do { + try AVAudioSession.sharedInstance().overrideOutputAudioPort( + speakerEnabled ? + AVAudioSession.PortOverride.speaker : AVAudioSession.PortOverride.none + ) + } catch { + print(error) + } + } + + func changeVideoDevice() + { + mUsedVideoDeviceId = (mUsedVideoDeviceId + 1) % mVideoDevices.count + + do { + try mCore.setVideodevice(newValue: mVideoDevices[mUsedVideoDeviceId]) + } catch { + print(error) + } + } + +} + + + + +class LinphoneLoggingServiceManager: LoggingServiceDelegate { + + var tutorialContext : CallExampleContext! + + override func onLogMessageWritten(logService: LoggingService, domain: String, lev: LogLevel, message: String) { + if (tutorialContext.logsEnabled) + { + print("Logging service log: \(message)s\n") + } + } +} + + +class LinconePhoneStateTracker: CoreDelegate { + override func onCallStateChanged(lc: Core, call: Call, cstate: Call.State, message: String) { + switch cstate { + case .OutgoingRinging: + print("CallTrace - It is now ringing remotely !\n") + case .OutgoingEarlyMedia: + print("CallTrace - Receiving some early media\n") + case .Connected: + print("CallTrace - We are connected !\n") + case .StreamsRunning: + print("CallTrace - Media streams established !\n") + case .End: + print("CallTrace - Call is terminated.\n") + case .Error: + print("CallTrace - Call failure !") + default: + print("CallTrace - Unhandled notification \(cstate)\n") + } + } +} diff --git a/swift/CallTutorial/CallTutorial/ContentView.swift b/swift/CallTutorial/CallTutorial/ContentView.swift new file mode 100644 index 0000000..0871711 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/ContentView.swift @@ -0,0 +1,102 @@ +// +// ContentView.swift +// CallTutorial +// +// Created by QuentinArguillere on 31/07/2020. +// Copyright © 2020 BelledonneCommunications. All rights reserved. +// + +import SwiftUI + +struct ContentView: View { + + @ObservedObject var tutorialContext = CallExampleContext() + + var body: some View { + + VStack(alignment: .leading) { + VStack(spacing: 0.0) { + Text("Call Settings") + .font(.largeTitle) + HStack { + Text("Call destination :") + TextField("", text : $tutorialContext.dest) + .textFieldStyle(RoundedBorderTextFieldStyle()) + } + .padding(.top) + } + VStack(alignment: .leading) { + Toggle(isOn: $tutorialContext.audioEnabled) { + Text("Audio") + }.frame(width : 120.0) + Toggle(isOn: $tutorialContext.videoEnabled) { + Text("Video") + }.frame(width : 120.0) + Button(action: tutorialContext.changeVideoDevice) + { + Text(" Change camera ") + .font(.title) + .foregroundColor(Color.white) + .background(Color.gray) + } + .padding(.vertical) + HStack { + Text("Speaker :") + Button(action: tutorialContext.speaker) + { + Text(tutorialContext.speakerEnabled ? "ON" : "OFF") + .font(.title) + .foregroundColor(Color.white) + .frame(width: 60.0, height: 30.0) + .background(Color.gray) + } + } + } + .padding(.top, 5.0) + Spacer() + VStack { + HStack { + Button(action: tutorialContext.outgoingCallExample) + { + Text(tutorialContext.callRunning ? "Update Call" : "Call") + .font(.largeTitle) + .foregroundColor(Color.white) + .frame(width: 180.0, height: 42.0) + .background(Color.green) + } + Button(action: tutorialContext.stopOutgoingCallExample) { + Text("Stop Call") + .font(.largeTitle) + .foregroundColor(Color.white) + .frame(width: 180.0, height: 42.0) + .background(Color.red) + } + } + HStack { + Text("Call State : ") + .font(.footnote) + Text(tutorialContext.callRunning ? "Ongoing" : "Stopped") + .font(.footnote) + .foregroundColor(tutorialContext.callRunning ? Color.green : Color.black) + } + .padding(.top) + } + Spacer() + Group { + Toggle(isOn: $tutorialContext.logsEnabled) { + Text("Logs collection") + .multilineTextAlignment(.trailing) + } + Text("Core Version is \(tutorialContext.coreVersion)") + .font(.footnote) + } + } + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/swift/CallTutorial/CallTutorial/Info.plist b/swift/CallTutorial/CallTutorial/Info.plist new file mode 100644 index 0000000..27a1721 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/Info.plist @@ -0,0 +1,66 @@ + + + + + NSCameraUsageDescription + Camera access + NSMicrophoneUsageDescription + Microphone access + LSApplicationCategoryType + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/swift/CallTutorial/CallTutorial/Preview Content/Preview Assets.xcassets/Contents.json b/swift/CallTutorial/CallTutorial/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/swift/CallTutorial/CallTutorial/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/swift/CallTutorial/CallTutorial/SceneDelegate.swift b/swift/CallTutorial/CallTutorial/SceneDelegate.swift new file mode 100644 index 0000000..08c465f --- /dev/null +++ b/swift/CallTutorial/CallTutorial/SceneDelegate.swift @@ -0,0 +1,64 @@ +// +// SceneDelegate.swift +// CallTutorial +// +// Created by QuentinArguillere on 31/07/2020. +// Copyright © 2020 BelledonneCommunications. All rights reserved. +// + +import UIKit +import SwiftUI + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + // Create the SwiftUI view that provides the window contents. + let contentView = ContentView() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/swift/CallTutorial/Podfile b/swift/CallTutorial/Podfile new file mode 100644 index 0000000..385558e --- /dev/null +++ b/swift/CallTutorial/Podfile @@ -0,0 +1,24 @@ +# Uncomment the next line to define a global platform for your project +platform :ios, '11.0' +source "https://gitlab.linphone.org/BC/public/podspec.git" +#source "https://github.com/CocoaPods/Specs.git" + +def basic_pods + if ENV['PODFILE_PATH'].nil? + pod 'linphone-sdk', '~> 4.5.0-alpha' + else + pod 'linphone-sdk', :path => ENV['PODFILE_PATH'] # local sdk + end + +end + + + +target 'CallTutorial' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for HelloLinphone + basic_pods + +end