name: ElementX

schemes:
  ElementX:
    analyze:
      config: Debug
    archive:
      config: Release
    build:
      targets:
        ElementX:
          - running
          - testing
          - profiling
          - analyzing
          - archiving
    profile:
      config: Release
    run:
      config: Debug
      environmentVariables:
        - variable: HTTPS_PROXY
          value: localhost:9090
          isEnabled: false
        - variable: UI_TESTS_SCREEN
          value: ""
          isEnabled: false
        - variable: RESET_APP_SETTINGS
          value: "true"
          isEnabled: false
    test:
      config: Debug
      gatherCoverageData: true
      coverageTargets:
        - ElementX
      testPlans:
        - path: ../../UnitTests/SupportingFiles/UnitTests.xctestplan
          defaultPlan: true

targets:
  ElementX:
    type: application
    platform: iOS

    info:
      path: Info.plist
      properties:
        UILaunchScreen:
          UIColorName: colors/background-color
        CFBundleDisplayName: $(APP_DISPLAY_NAME)
        CFBundleShortVersionString: $(MARKETING_VERSION)
        CFBundleVersion: $(CURRENT_PROJECT_VERSION)
        CFBundleURLTypes: [
          {
            CFBundleTypeRole: Editor,
            CFBundleURLName: "Element Call",
            CFBundleURLSchemes: [
              io.element.call
            ]
          },
          {
            CFBundleTypeRole: Editor,
            CFBundleURLName: "Application",
            CFBundleURLSchemes: [
              $(BASE_BUNDLE_IDENTIFIER), # The app's own scheme for custom routes
              "matrix" # Matrix URI scheme for permalinks
            ]
          }
        ]
        UISupportedInterfaceOrientations: [
          UIInterfaceOrientationPortrait,
          UIInterfaceOrientationPortraitUpsideDown,
          UIInterfaceOrientationLandscapeLeft,
          UIInterfaceOrientationLandscapeRight
        ]
        appGroupIdentifier: $(APP_GROUP_IDENTIFIER)
        baseBundleIdentifier: $(BASE_BUNDLE_IDENTIFIER)
        keychainAccessGroupIdentifier: $(KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
        classicAppGroupIdentifier: $(CLASSIC_APP_GROUP_IDENTIFIER)
        classicAppKeychainServiceIdentifier: $(CLASSIC_APP_KEYCHAIN_SERVICE_IDENTIFIER)
        classicAppKeychainAccessGroupIdentifier: $(CLASSIC_APP_KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
        productionAppName: $(PRODUCTION_APP_NAME)
        ITSAppUsesNonExemptEncryption: false
        NSUserActivityTypes: [
          INSendMessageIntent,
          INStartCallIntent,
        ]
        NSCameraUsageDescription: To take pictures or videos and send them as a message $(APP_DISPLAY_NAME) needs access to the camera.
        NSMicrophoneUsageDescription: To record and send messages with audio, $(APP_DISPLAY_NAME) needs to access the microphone.
        NSPhotoLibraryAddUsageDescription: This lets you save images and videos to your photo library.
        NSLocationAlwaysAndWhenInUseUsageDescription: To share your live location, $(APP_DISPLAY_NAME) needs location access when the app is in the background.
        NSLocationWhenInUseUsageDescription: Grant location access so that $(APP_DISPLAY_NAME) can share your location.
        NSFaceIDUsageDescription: Face ID is used to access your app.
        UIBackgroundModes: [
          audio,
          fetch,
          processing,
          voip
        ]
        BGTaskSchedulerPermittedIdentifiers: [
          io.element.elementx.background.refresh
        ]
        UTExportedTypeDeclarations:
        - UTTypeConformsTo: [public.text]
          UTTypeDescription: Mention Pills
          UTTypeIdentifier: $(PILLS_UT_TYPE_IDENTIFIER)
        CFBundleDocumentTypes:
        - CFBundleTypeName: Mention Pills
          CFBundleTypeRole: Viewer
          LSHandlerRank: Owner
          LSItemContentTypes: $(PILLS_UT_TYPE_IDENTIFIER)
        LSSupportsOpeningDocumentsInPlace: false

    entitlements:
      path: ElementX.entitlements
      properties:
        aps-environment: development
        com.apple.developer.associated-domains:
        - applinks:element.io
        - applinks:app.element.io
        - applinks:staging.element.io
        - applinks:develop.element.io
        - applinks:mobile.element.io
        - applinks:call.element.io
        - applinks:call.element.dev
        - applinks:matrix.to
        # - applinks:localhost?mode=developer # developer mode only works with https (but self-signed is fine).
        - webcredentials:*.letro.com
        com.apple.developer.usernotifications.communication: true
        com.apple.security.app-sandbox: true
        com.apple.security.application-groups:
        - $(APP_GROUP_IDENTIFIER)
        - $(CLASSIC_APP_GROUP_IDENTIFIER)
        com.apple.security.network.client: true
        keychain-access-groups:
        - $(KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
        - $(CLASSIC_APP_KEYCHAIN_ACCESS_GROUP_IDENTIFIER)

    settings:
      base:
        PRODUCT_NAME: $(APP_NAME)
        PRODUCT_BUNDLE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER)
        MARKETING_VERSION: $(MARKETING_VERSION)
        CURRENT_PROJECT_VERSION: $(CURRENT_PROJECT_VERSION)
        ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
        DEVELOPMENT_TEAM: $(DEVELOPMENT_TEAM)
        SWIFT_OBJC_BRIDGING_HEADER: ElementX/SupportingFiles/ElementX-Bridging-Header.h
        SWIFT_OBJC_INTERFACE_HEADER_NAME: GeneratedInterface-Swift.h
        PILLS_UT_TYPE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER).pills
        DEVELOPMENT_ASSET_PATHS: DevelopmentAssets/Media
        OTHER_SWIFT_FLAGS:
        - "-DIS_MAIN_APP"

    preBuildScripts:
    - name: 🛠 SwiftGen
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which swiftgen >/dev/null; then
            swiftgen config run --config Tools/SwiftGen/swiftgen-config.yml
        else
            echo "warning: SwiftGen not installed, download from https://github.com/SwiftGen/SwiftGen"
        fi
    - name: 🧙 Sourcery - Generate mocks
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which sourcery >/dev/null; then
            sourcery --config Tools/Sourcery/AutoMockableConfig.yml
        else
            echo "warning: Sourcery not installed, run swift run tools setup-project"
        fi

    - name: 🧙 Sourcery - Generate preview tests
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which sourcery >/dev/null; then
            sourcery --config Tools/Sourcery/PreviewTestsConfig.yml
        else
            echo "warning: Sourcery not installed, run swift run tools setup-project"
        fi
        
    - name: 🧙 Sourcery - Generate Accessibility Tests
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which sourcery >/dev/null; then
            sourcery --config Tools/Sourcery/TestablePreviewsDictionary.yml
            sourcery --config Tools/Sourcery/AccessibilityTests.yml
        else
            echo "warning: Sourcery not installed, run swift run tools setup-project"
        fi

    postBuildScripts:
    - name: ⚠️ SwiftLint
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which swiftlint >/dev/null; then
            swiftlint
        else
            echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
        fi
    - name: 🧹 SwiftFormat
      runOnlyWhenInstalling: false
      basedOnDependencyAnalysis: false
      shell: /bin/sh
      script: |
        export PATH="$PATH:/opt/homebrew/bin"
        if which swiftformat >/dev/null; then
            swiftformat --lint --lenient "$PROJECT_DIR"
        else
            echo "warning: SwiftFormat not installed, download from https://github.com/nicklockwood/SwiftFormat"
        fi

    dependencies:
    - target: NSE
    - target: ShareExtension
    - target: MatrixRustSDKMocks
    - package: MatrixRustSDK
      embed: true
    - package: Compound
    - package: Algorithms
    - package: AsyncAlgorithms
    - package: AnalyticsEvents
    - package: Collections
    - package: DeviceKit
    - package: EmbeddedElementCall
    - package: KeychainAccess
    - package: Kingfisher
    - package: KZFileWatchers
    - package: LoremSwiftum
    - package: LRUCache
    - package: MapLibre
    - package: PostHog
    - package: SwiftState
    - package: GZIP
    - package: Sentry
      products: 
        - Sentry
        - SentrySwiftUI
    - package: Version
    - package: Emojibase
    - package: WysiwygComposer
    - package: SwiftOGG
    - package: SwiftSoup
    - package: SwiftFlow
      product: Flow
    - package: DSWaveformImage
      product: DSWaveformImageViews

    sources:
    - path: ../Sources
      excludes:
        - Other/Extensions/XCTestCase.swift
        - Other/Extensions/XCUIElement.swift
    - path: ../../Secrets/Secrets.swift
    - path: ../Resources
    - path: ../SupportingFiles
    - path: ../../Tools/Scripts/Templates/SimpleScreenExample/ElementX
    - path: ../../DevelopmentAssets/Media
    
    # This is required for testing purposes... The problem with unit tests is that if you
    # try to `@testable import NSE` you can only get the definition of files, but due to a
    # limitation in how they work, they can only compile files that are part of the main test
    # target, so linking will fail. The solution is to just have the main app to reference the
    # extension code, and test it directly.
    - path: ../../NSE/Sources
