// // Copyright 2020 Vector Creations Ltd // Copyright (c) 2021 BWI GmbH // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // import Foundation /// BuildSettings provides settings computed at build time. /// In future, it may be automatically generated from xcconfig files @objcMembers final class BuildSettings: NSObject { // MARK: - Bundle Settings static var applicationGroupIdentifier: String { guard let applicationGroupIdentifier = Bundle.app.object(forInfoDictionaryKey: "applicationGroupIdentifier") as? String else { fatalError("applicationGroupIdentifier should be defined") } return applicationGroupIdentifier } static var baseBundleIdentifier: String { guard let baseBundleIdentifier = Bundle.app.object(forInfoDictionaryKey: "baseBundleIdentifier") as? String else { fatalError("baseBundleIdentifier should be defined") } return baseBundleIdentifier } static var keychainAccessGroup: String { guard let keychainAccessGroup = Bundle.app.object(forInfoDictionaryKey: "keychainAccessGroup") as? String else { fatalError("keychainAccessGroup should be defined") } return keychainAccessGroup } static var applicationURLScheme: String? { guard let urlTypes = Bundle.app.object(forInfoDictionaryKey: "CFBundleURLTypes") as? [AnyObject], let urlTypeDictionary = urlTypes.first as? [String: AnyObject], let urlSchemes = urlTypeDictionary["CFBundleURLSchemes"] as? [AnyObject], let externalURLScheme = urlSchemes.first as? String else { return nil } return externalURLScheme } static var pushKitAppIdProd: String { return baseBundleIdentifier + ".ios.voip.prod" } static var pushKitAppIdDev: String { return baseBundleIdentifier + ".ios.voip.dev" } static var pusherAppIdProd: String { return baseBundleIdentifier + ".ios.prod" } static var pusherAppIdDev: String { return baseBundleIdentifier + ".ios.dev" } static var pushKitAppId: String { #if DEBUG return pushKitAppIdDev #else return pushKitAppIdProd #endif } static var pusherAppId: String { #if DEBUG return pusherAppIdDev #else return pusherAppIdProd #endif } // Element-Web instance for the app static let applicationWebAppUrlString = "" // MARK: - Localization /// Whether to allow the app to use a right to left layout or force left to right for all languages static let disableRightToLeftLayout = true // MARK: - Server configuration // Default servers proposed on the authentication screen static let serverConfigDefaultHomeserverUrlString = "" static let serverConfigDefaultIdentityServerUrlString = "" static let serverConfigPreSelections = ["":""] static let serverConfigSygnalAPIUrlString = "" // MARK: - Legal URLs // Note: Set empty strings to hide the related entry in application settings static let applicationCopyrightUrlString = "https://element.io/copyright" static let applicationPrivacyPolicyUrlString = "" static let applicationTermsConditionsUrlString = "https://element.io/terms-of-service" static let applicationHelpUrlString = "https://element.io/help" // MARk: - Matrix permalinks // Paths for URLs that will considered as Matrix permalinks. Those permalinks are opened within the app static let permalinkSupportedHosts: [String: [String]] = [:] // For use in clients that use a custom base url for permalinks rather than matrix.to. // This baseURL is used to generate permalinks within the app (E.g. timeline message permalinks). // Optional String that when set is used as permalink base, when nil matrix.to format is used. // Example value would be "https://www.example.com", note there is no trailing '/'. static let clientPermalinkBaseUrl: String? = nil // MARK: - VoIP static var allowVoIPUsage: Bool { #if canImport(JitsiMeetSDK) return false #else return false #endif } static let stunServerFallbackUrlString: String? = "" // MARK: - Public rooms Directory // List of homeservers for the public rooms directory static let publicRoomsDirectoryServers = [ "matrix.org" ] // MARK: - Rooms Screen static let roomsAllowToJoinPublicRooms: Bool = true // MARK: - Analytics // $$$ static let analyticsServerUrl = URL(string: "") static let analyticsAppId = "0" /// BWI: set host and key to nil to disable PostHog tracking static let analyticsHost: String? = nil static let analyticsKey: String? = nil static let analyticsTermsURL = URL(string: "https://element.io/cookie-policy")! static let bwiPresentAnalyticsPrompt = false static let bwiAnalyticsServerUrlString = "" static let bwiAnalyticsAppId = "1" /// A type that represents how to set up the analytics module in the app. /// /// **Note:** Analytics are disabled by default for forks. /// If you are maintaining a fork, set custom configurations. struct AnalyticsConfiguration { /// Whether or not analytics should be enabled. let isEnabled: Bool /// The host to use for PostHog analytics. let host: String /// The public key for submitting analytics. let apiKey: String /// The URL to open with more information about analytics terms. let termsURL: URL } /// The configuration to use for analytics during development. Set `isEnabled` to false to disable analytics in debug builds. static let analyticsConfiguration = AnalyticsConfiguration(isEnabled: false, host: "", apiKey: "", termsURL: URL(string: "https://element.io/cookie-policy")!) // MARK: - Bug report static let bugReportEndpointUrlString = "" // Use the name allocated by the bug report server static let bugReportApplicationId = "riot-ios" static let bugReportUISIId = "element-auto-uisi" // MARK: - Integrations static let integrationsUiUrlString = "https://scalar.vector.im/" static let integrationsRestApiUrlString = "https://scalar.vector.im/api" // Widgets in those paths require a scalar token static let integrationsScalarWidgetsPaths = [""] // Jitsi server used outside integrations to create conference calls from the call button in the timeline static let jitsiServerUrl: URL = URL(string: "https://enter.jitsi.url")! // MARK: - Features /// Setting to force protection by pin code static let forcePinProtection: Bool = true /// Max allowed time to continue using the app without prompting PIN static let pinCodeGraceTimeInSeconds: TimeInterval = 180 /// Force non-jailbroken app usage static let forceNonJailbrokenUsage: Bool = true static let allowSendingStickers: Bool = false static let allowLocalContactsAccess: Bool = false static let allowInviteExernalUsers: Bool = false static let enableSideMenu: Bool = false static let sideMenuShowInviteFriends: Bool = false /// Whether to read the `io.element.functional_members` state event and exclude any service members when computing a room's name and avatar. static let supportFunctionalMembers: Bool = true // MARK: - Feature Specifics /// Not allowed pin codes. User won't be able to select one of the pin in the list. static let notAllowedPINs: [String] = [ "1234", "1111", "0000", "1212", "7777", "1004", "2000", "4444", "2222", "6969", "9999", "3333", "5555", "6666", "1122", "1313", "8888", "4321", "2001", "1010", "2580", "4711", "0815", "0852" ] /// Maximum number of allowed pin failures when unlocking, before force logging out the user. Defaults to `3` static let maxAllowedNumberOfPinFailures: Int = 3 /// Maximum number of allowed biometrics failures when unlocking, before fallbacking the user to the pin if set or logging out the user. Defaults to `5` static let maxAllowedNumberOfBiometricsFailures: Int = 5 static let allowLocalContactPresence: Bool = false /// Indicates should the app log out the user when number of PIN failures reaches `maxAllowedNumberOfPinFailures`. Defaults to `false` static let logOutUserWhenPINFailuresExceeded: Bool = true /// Indicates should the app log out the user when number of biometrics failures reaches `maxAllowedNumberOfBiometricsFailures`. Defaults to `false` static let logOutUserWhenBiometricsFailuresExceeded: Bool = true /// If force is enabled the dialog for asking if reseting the key backup is not shown.. already asked before in mandatory verfication static let forceResetBackupIfLost: Bool = true /// if skip is enabled the key backup dialogs are passed through static let skipKeyBackupStep: Bool = true static let showNotificationsV2: Bool = true // MARK: - Main Tabs static let homeScreenShowHomeTab: Bool = false static let homeScreenShowFavouritesTab: Bool = true static let homeScreenShowPeopleTab: Bool = true static let homeScreenShowRoomsTab: Bool = true // MARK: - General Settings Screen static let settingsScreenShowUserFirstName: Bool = false static let settingsScreenShowUserSurname: Bool = false static let settingsScreenAllowAddingLinkedEmails: Bool = false static let settingsScreenAllowAddingPhoneNumbers: Bool = false static let settingsScreenAllowAddingEmailThreepids: Bool = false static let settingsScreenAllowAddingPhoneThreepids: Bool = false static let settingsScreenShowThreepidExplanatory: Bool = false static let settingsScreenShowDiscoverySettings: Bool = false static let settingsScreenAllowIdentityServerConfig: Bool = false static let settingsScreenShowConfirmMediaSize: Bool = false static let settingsScreenShowAdvancedSettings: Bool = false static let settingsScreenShowLabSettings: Bool = false static let settingsScreenAllowChangingRageshakeSettings: Bool = false static let settingsScreenAllowChangingCrashUsageDataSettings: Bool = false static let settingsScreenAllowBugReportingManually: Bool = false static let settingsScreenAllowDeactivatingAccount: Bool = false static let settingsScreenEnableDecodedContentAndGlobalSettings: Bool = false static let settingsScreenShowChangePassword:Bool = true static let settingsScreenShowLinkPreviews:Bool = false static let settingsScreenShowInviteFriends:Bool = false static let settingsScreenShowSettings:Bool = true static let settingsScreenShowFeedback:Bool = false static let settingsScreenShowHelp:Bool = false static let settingsScreenShowEnableStunServerFallback: Bool = true static let settingsScreenShowNotificationDecodedContentOption: Bool = false static let settingsScreenShowSystemSettingsOption: Bool = false static let settingsScreenShowNsfwRoomsOption: Bool = false static let settingsScreenShowTACSetting: Bool = false static let settingsScreenShowSupportSetting: Bool = true static let settingsSecurityScreenShowSessions:Bool = true static let settingsSecurityScreenShowSetupBackup:Bool = true static let settingsSecurityScreenShowRestoreBackup:Bool = true static let settingsSecurityScreenShowDeleteBackup:Bool = true /// A setting to enable the presence configuration settings section. static let settingsScreenPresenceAllowConfiguration: Bool = false static let settingsSecurityScreenShowCryptographyInfo:Bool = false static let settingsSecurityScreenShowCryptographyExport:Bool = false static let settingsSecurityScreenShowAdvancedUnverifiedDevices:Bool = false // MARK: - Notification Settings static let settingsNotificationsBWIDefaultSet:Bool = true static let settingsNotificationsShowDefault:Bool = true static let settingsNotificationsShowMentions:Bool = false static let settingsNotificationsShowAdvanced:Bool = false // MARK: - Timeline settings static let roomInputToolbarCompressionMode: MediaCompressionMode = .none enum MediaCompressionMode { case prompt, small, medium, large, none } // MARK: - Room Creation Screen static let roomCreationScreenAllowEncryptionConfiguration: Bool = false static let roomCreationScreenRoomIsEncrypted: Bool = true static let roomCreationScreenAllowRoomTypeConfiguration: Bool = true static let roomCreationScreenRoomIsPublic: Bool = false // MARK: - Room Screen static let roomScreenAllowVoIPForDirectRoom: Bool = true static let roomScreenAllowVoIPForNonDirectRoom: Bool = true static let roomScreenAllowCameraAction: Bool = true static let roomScreenAllowMediaLibraryAction: Bool = true static let roomScreenAllowStickerAction: Bool = false static let roomScreenAllowFilesAction: Bool = true // Timeline style static let roomScreenAllowTimelineStyleConfiguration: Bool = true static let roomScreenTimelineDefaultStyleIdentifier: RoomTimelineStyleIdentifier = .plain static var isRoomScreenEnableMessageBubblesByDefault: Bool { return self.roomScreenTimelineDefaultStyleIdentifier == .bubble } static let roomScreenUseOnlyLatestUserAvatarAndName: Bool = false /// Allow split view detail view stacking static let allowSplitViewDetailsScreenStacking: Bool = true // MARK: - Room Contextual Menu static let roomContextualMenuShowMoreOptionForMessages: Bool = true static let roomContextualMenuShowMoreOptionForStates: Bool = true static let roomContextualMenuShowReportContentOption: Bool = true static let roomContextualMenuShowEncryptionOption: Bool = false // MARK: - Room Info Screen static let roomInfoScreenShowIntegrations: Bool = false // MARK: - Room Settings Screen static let roomSettingsScreenShowLowPriorityOption: Bool = false static let roomSettingsScreenShowDirectChatOption: Bool = false static let roomSettingsScreenAllowChangingAccessSettings: Bool = false static let roomSettingsScreenAllowChangingHistorySettings: Bool = false static let roomSettingsScreenShowAddressSettings: Bool = false static let roomSettingsScreenShowAdvancedSettings: Bool = false static let roomSettingsScreenShowAccessSettingsBW: Bool = true static let roomSettingsScreenRemoveLeave: Bool = true static let roomSettingsScreenAdvancedShowEncryptToVerifiedOption: Bool = true static let roomSettingsScreenShowNotificationsV2: Bool = false // MARK: - Room Member Screen static let roomMemberScreenShowIgnore: Bool = true // MARK: - Message static let messageDetailsAllowShare: Bool = false static let messageDetailsAllowPermalink: Bool = false static let messageDetailsAllowViewSource: Bool = false static let messageDetailsAllowSave: Bool = false static let messageDetailsAllowCopyMedia: Bool = false static let messageDetailsAllowPasteMedia: Bool = false // MARK: - Notifications static let decryptNotificationsByDefault: Bool = true // MARK: - Authentication Screen static let authScreenShowRegister = false static let authScreenShowPhoneNumber = false static let authScreenShowForgotPassword = false static let authScreenShowCustomServerOptions = true static let authScreenShowTestServerOptions = true static let authScreenShowSocialLoginSection = false // MARK: - Authentication Options static let authEnableRefreshTokens = false // MARK: - Cross-signing (bwi=true) static let disableSelfUserVerification = true // MARK: - Antivirus scan (bwi=true) static let enableAntivirusScan = false // MARK: - Room Screen static let enableRoomSearchItem = false // MARK: - Matomo Analytics (bwi=false) static let enableMatomoAnalytics = false // MARK: Verification screen (bwi=false) static let showDetailedVerificationElements : Bool = false static let showRecoverWithKey : Bool = false // MARK: Unified search screen (bwi=false) static let showUnifiedSearchViewMessagesTab : Bool = false static let showUnifiedSearchViewFilesTab : Bool = false // MARK: - Onboarding static let onboardingShowAccountPersonalization = false static let onboardingEnableNewAuthenticationFlow = false // MARK: - Secrets Recovery static let secretsRecoveryAllowReset = true // MARK: VoIP support (bwi=false) static let enableVoIPSupport : Bool = false // MARK: - UISI Autoreporting static let cryptoUISIAutoReportingEnabled = false // MARK: - Polls // MARK: Last message timestamp support (bwi=false) static let enableLastMessageTimestamp : Bool = false // MARK: Room chat alert screen (bwi=false) static let enableViewEncryptionAction : Bool = false // MARK: JavaScript support in WKWebView (bwi=false) static let enableJSInWebView : Bool = false // MARK: Secure pin code description (bwi=false) static let settingsSettingsSecureShowPinCodeDescription : Bool = false // MARK: Invite friends in Direct Chat (bwi=false) static let directChatShowInviteFriends : Bool = false // MARK: Last admin is not allowed to leave the room (bwi=true) static let lastAdminIsNotAllowedToLeaveRoom : Bool = true // MARK: Room Member Details Screen (bwi=true) static let roomMemberDetailsHideLeaveButton : Bool = true // MARK: Room create options (bwi=false) static let enableShowInRoomDirectory : Bool = false // MARK: sticker in composer (bwi=false) static let enableRoomComposerSticker : Bool = false // Mark: Unified Search (bwi=true) static let unifiedSearchScreenShowPublicDirectory = true // MARK: Allows removal of uploaded avatar photos (bwi=true) static let enableRemoveAvatarImage = true // MARK: Add a toggle button to the login screen to make the password visible static let passwordIndicatorOnLogin : Bool = true // MARK: Displays the element base version on the settings screen static let elementBaseVersion : String = "1.8.24" static let showElementBaseVersion : Bool = true // MARK: Bypasses the normal forgot password process by presenting the user an information alert // (requires authScreenShowForgotPassword set to true) static let forgotPasswordInformationAlert : Bool = true // MARK: Promote new feature within a banner below the navigation view static let showTopBanner : Bool = true static let showCustomServerDisplayName : Bool = true static let customServerDisplayName : String = "" // MARK BWI show/hide developer menu static let bwiShowDeveloperSettings : Bool = false // MARK BWI personal notes room static let bwiPersonalNotesRoom : Bool = false static let bwiPersonalNotesRoomLeavable : Bool = false static let bwiResetPersonalNotesAccountData : Bool = false static let bwiShowTimelineSettings : Bool = false // MARK BWI personal state static let bwiPersonalState : Bool = false // MARK BWI personal notes room static let bwiRollsAndRights : Bool = true // MARK: Timeline static let settingsScreenShowSimpleTimeLineOptions : Bool = false static let settingsScreenShowTimeStampOption : Bool = true static let settingsScreenShowDeletedMessagesOption : Bool = false static let settingsScreenShowNameChangeOption : Bool = false static let settingsScreenShowChatEffectsOption : Bool = false static let settingsScreenShowRoomAvatarChangeOption : Bool = false static let settingsScreenShowUserAvatarChangeOption : Bool = true static let settingsScreenShowEnterRoomOption : Bool = true static let bwiLastAdminCanDowngradeHimself : Bool = false static let bwiEnableErrorTracking : Bool = false static let bwiEnableRegisterInfo : Bool = false static let bwiShowHappyBirthdayCampaign: Bool = false static let bwiHappyBirthdayCampaignIdentifier: String = "one_year_anniversary" static let bwiDisableSecuritySettingsUntrustedDevices: Bool = true static let bwiShowMatomoInfoScreen = false static let bwiShowMatomoSettings = false static let bwiMatomoTrackingDefaultState = false static let bwiShowNewFeatures = true static let bwiSendMessageThreshold = 10.0 static let pollsEnabled = true // MARK: - Location Sharing /// Overwritten by the home server's .well-known configuration (if any exists) static let defaultTileServerMapStyleURL = URL(string: "https://api.maptiler.com")! static let locationSharingEnabled = false // MARK: - MXKAppSettings static let enableBotCreation: Bool = false static let maxAllowedMediaCacheSize: Int = 1073741824 static let presenceColorForOfflineUser: Int = 15020851 static let presenceColorForOnlineUser: Int = 3401011 static let presenceColorForUnavailableUser: Int = 15066368 static let showAllEventsInRoomHistory: Bool = false static let showLeftMembersInRoomMemberList: Bool = false static let showRedactionsInRoomHistory: Bool = true static let showUnsupportedEventsInRoomHistory: Bool = false static let sortRoomMembersUsingLastSeenTime: Bool = true static let syncLocalContacts: Bool = false // MARK: - New App Layout static let newAppLayoutEnabled = false // MARK: - Device manager static let deviceManagerEnabled = false }