From 560cefae944d7e4011d481e082170ac35f8ff980 Mon Sep 17 00:00:00 2001 From: Max Radermacher Date: Mon, 27 Oct 2025 13:27:11 -0500 Subject: [PATCH] =?UTF-8?q?Rename=20FeatureFlags=20=E2=86=92=20BuildFlags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Scripts/feature_flags_common.py | 2 +- Signal.xcodeproj/project.pbxproj | 16 +++++------ Signal/AppLaunch/AppDelegate.swift | 4 +-- Signal/Backups/BackupEnablingManager.swift | 2 +- .../BackupSettingsViewController.swift | 4 +-- .../ChooseBackupPlanViewController.swift | 2 +- .../CallsListViewController.swift | 8 +++--- .../ConversationInputToolbar+VoiceMemo.swift | 2 +- ...onViewController+CVComponentDelegate.swift | 2 +- ...ler+ConversationInputToolbarDelegate.swift | 2 +- .../ConversationViewController+UI.swift | 4 +-- Signal/Emoji/EmojiPickerSectionToolbar.swift | 2 +- .../RegistrationCoodinatorShims.swift | 12 ++++----- .../RegistrationCoordinatorDependencies.swift | 4 +-- .../RegistrationCoordinatorImpl.swift | 8 +++--- .../RegistrationCoordinatorLoader.swift | 4 +-- .../RegistrationSplashViewController.swift | 6 ++--- Signal/src/BackupBGProcessingTaskRunner.swift | 2 +- .../ContextualActionBuilder.swift | 2 +- .../AppSettings/Donations/PaypalButton.swift | 2 +- .../InternalSettingsViewController.swift | 4 +-- .../AttachmentFormatPickerView.swift | 4 +-- ...upArchiveInternalErrorViewController.swift | 4 +-- .../ContextMenuActionsAccessory.swift | 18 ++++++------- .../HomeView/Chat List/CLVLoader.swift | 2 +- .../ChatListViewController+Helpers.swift | 2 +- .../ChatListViewController+Multiselect.swift | 10 +++---- .../Chat List/ChatListViewController.swift | 2 +- .../ConversationSplitViewController.swift | 4 +-- .../HomeView/HomeTabBarController.swift | 2 +- .../HomeView/HomeTabViewController.swift | 2 +- .../ConversationSettingsViewController.swift | 2 +- Signal/src/views/JoinGroupCallPill.swift | 4 +-- .../RegistrationCoordinatorTest.swift | 6 ++--- .../RegistrationCoordinatorTestShims.swift | 4 +-- .../Account/PreKeys/PrekeyManagerImpl.swift | 2 +- .../BackupArchiveAccountDataArchiver.swift | 2 +- .../Archivers/BackupArchive+Errors.swift | 2 +- .../Archiving/BackupArchive+Bench.swift | 4 +-- .../Archiving/BackupArchiveManagerImpl.swift | 18 ++++++------- .../AttachmentOffloadingManager.swift | 2 +- .../BackupAttachmentDownloadEligibility.swift | 4 +-- .../BackupAttachmentUploadQueueRunner.swift | 4 +-- .../Attachments/BackupListMediaManager.swift | 6 ++--- .../OrphanedBackupAttachmentQueueRunner.swift | 2 +- .../OrphanedBackupAttachmentScheduler.swift | 2 +- .../Backups/Settings/BackupIdService.swift | 4 +-- .../Settings/BackupRefreshManager.swift | 2 +- .../Contacts/ContactOutputStream.swift | 2 +- SignalServiceKit/Debugging/OWSFail.swift | 2 +- .../Devices/LinkingProvisioningMessage.swift | 4 +-- .../OWSBlockedPhoneNumbersMessage.m | 2 +- .../OWSReadReceiptsForLinkedDevicesMessage.m | 2 +- .../OWSViewOnceMessageReadSyncMessage.m | 2 +- ...OWSViewedReceiptsForLinkedDevicesMessage.m | 2 +- SignalServiceKit/Environment/AppSetup.swift | 4 +-- ...rated.swift => BuildFlags+Generated.swift} | 0 .../{FeatureFlags.swift => BuildFlags.swift} | 27 +++++++++---------- .../Environment/RemoteConfigManager.swift | 8 +++--- .../ExperienceUpgradeManifest.swift | 4 +-- .../AttachmentDownloadManagerImpl.swift | 2 +- .../BodyRanges/MessageBodyRanges.swift | 2 +- .../DeleteForMeOutgoingSyncMessage.swift | 4 +-- .../OWSOutgoingSentMessageTranscript.m | 2 +- .../OWSOutgoingSentMessageTranscript.swift | 2 +- .../OWSSyncMessageRequestResponseMessage.m | 4 +-- .../Polls/OutgoingPollTerminate.swift | 2 +- .../Interactions/Polls/OutgoingPollVote.swift | 2 +- .../Quotes/QuotedReplyManagerImpl.swift | 2 +- .../Messages/Interactions/TSOutgoingMessage.m | 4 +-- .../Interactions/TSOutgoingMessage.swift | 2 +- .../Messages/MessageReceiver.swift | 4 +-- .../Reactions/OutgoingReactionMessage.swift | 2 +- .../OutgoingStorySentMessageTranscript.swift | 2 +- .../Security/OWSRecipientIdentity.swift | 2 +- .../Storage/Database/GRDBSchemaMigrator.swift | 2 +- ...crementalMessageTSAttachmentMigrator.swift | 2 +- .../TSAttachmentMigration+TSMessage.swift | 2 +- .../Database/Records/InteractionFinder.swift | 4 +-- .../StorageServiceProto+Sync.swift | 8 +++--- .../Backups/BackupSubscriptionManager.swift | 4 +-- .../BackupTestFlightEntitlementManager.swift | 8 +++--- SignalServiceKit/Util/Preferences.swift | 4 +-- .../ActionSheets/ActionSheetController.swift | 10 +++---- .../UIKitExtensions/UIButton+SignalUI.swift | 2 +- .../InteractiveSheetViewController.swift | 2 +- .../OWSNavigationController.swift | 2 +- .../OWSTableViewController2.swift | 4 +-- 88 files changed, 182 insertions(+), 183 deletions(-) rename SignalServiceKit/Environment/{FeatureFlags+Generated.swift => BuildFlags+Generated.swift} (100%) rename SignalServiceKit/Environment/{FeatureFlags.swift => BuildFlags.swift} (90%) diff --git a/Scripts/feature_flags_common.py b/Scripts/feature_flags_common.py index 346d4dec53..a8ceefae32 100755 --- a/Scripts/feature_flags_common.py +++ b/Scripts/feature_flags_common.py @@ -6,7 +6,7 @@ import re import subprocess import tag_template -FILE_PATH = "SignalServiceKit/Environment/FeatureFlags+Generated.swift" +FILE_PATH = "SignalServiceKit/Environment/BuildFlags+Generated.swift" def run(args): diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 81b33262b9..df75fb729c 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -659,7 +659,7 @@ 505C2ED42997015800C23FB2 /* LinkDeviceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505C2ED32997015800C23FB2 /* LinkDeviceViewController.swift */; }; 505C2ED629971D4E00C23FB2 /* DeviceLimitExceededError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505C2ED529971D4E00C23FB2 /* DeviceLimitExceededError.swift */; }; 505C2ED92997422D00C23FB2 /* SelfSignedIdentityTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505C2ED82997422D00C23FB2 /* SelfSignedIdentityTest.swift */; }; - 505F76332BC45C0700B1B51C /* FeatureFlags+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505F76322BC45C0700B1B51C /* FeatureFlags+Generated.swift */; }; + 505F76332BC45C0700B1B51C /* BuildFlags+Generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */; }; 5060EBBA2C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5060EBB92C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift */; }; 5063B41E2C5432A30041CA51 /* ResolvableValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5063B41D2C5432A30041CA51 /* ResolvableValue.swift */; }; 506695E129C296D500B6D8D0 /* RecipientMergerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506695E029C296D500B6D8D0 /* RecipientMergerTest.swift */; }; @@ -3652,7 +3652,7 @@ F9C5CE26289453B400548EEE /* UserProfileFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB54289453B200548EEE /* UserProfileFinder.swift */; }; F9C5CE29289453B400548EEE /* ModelReadCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB57289453B200548EEE /* ModelReadCache.swift */; }; F9C5CE2A289453B400548EEE /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB58289453B200548EEE /* Platform.swift */; }; - F9C5CE2B289453B400548EEE /* FeatureFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB59289453B200548EEE /* FeatureFlags.swift */; }; + F9C5CE2B289453B400548EEE /* BuildFlags.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB59289453B200548EEE /* BuildFlags.swift */; }; F9C5CE2D289453B400548EEE /* ExperienceUpgradeFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB5B289453B200548EEE /* ExperienceUpgradeFinder.swift */; }; F9C5CE2F289453B400548EEE /* SwiftSingletons.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB5D289453B200548EEE /* SwiftSingletons.swift */; }; F9C5CE33289453B400548EEE /* LocalDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C5CB61289453B200548EEE /* LocalDevice.swift */; }; @@ -4625,7 +4625,7 @@ 505C2ED529971D4E00C23FB2 /* DeviceLimitExceededError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceLimitExceededError.swift; sourceTree = ""; }; 505C2ED82997422D00C23FB2 /* SelfSignedIdentityTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelfSignedIdentityTest.swift; sourceTree = ""; }; 505C2EDA29974D2000C23FB2 /* StorageServiceContactTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageServiceContactTest.swift; sourceTree = ""; }; - 505F76322BC45C0700B1B51C /* FeatureFlags+Generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FeatureFlags+Generated.swift"; sourceTree = ""; }; + 505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BuildFlags+Generated.swift"; sourceTree = ""; }; 5060EBB92C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallLinkUpdateMessage.swift; sourceTree = ""; }; 5063B41D2C5432A30041CA51 /* ResolvableValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvableValue.swift; sourceTree = ""; }; 506695E029C296D500B6D8D0 /* RecipientMergerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientMergerTest.swift; sourceTree = ""; }; @@ -7661,7 +7661,7 @@ F9C5CB54289453B200548EEE /* UserProfileFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserProfileFinder.swift; sourceTree = ""; }; F9C5CB57289453B200548EEE /* ModelReadCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModelReadCache.swift; sourceTree = ""; }; F9C5CB58289453B200548EEE /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = ""; }; - F9C5CB59289453B200548EEE /* FeatureFlags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeatureFlags.swift; sourceTree = ""; }; + F9C5CB59289453B200548EEE /* BuildFlags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BuildFlags.swift; sourceTree = ""; }; F9C5CB5B289453B200548EEE /* ExperienceUpgradeFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperienceUpgradeFinder.swift; sourceTree = ""; }; F9C5CB5D289453B200548EEE /* SwiftSingletons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSingletons.swift; sourceTree = ""; }; F9C5CB61289453B200548EEE /* LocalDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalDevice.swift; sourceTree = ""; }; @@ -10499,9 +10499,9 @@ isa = PBXGroup; children = ( 5033D46A29DB9F17007FEADA /* AppSetup.swift */, + 505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */, + F9C5CB59289453B200548EEE /* BuildFlags.swift */, 6698FC192980AB45004EFC30 /* DependenciesBridge.swift */, - 505F76322BC45C0700B1B51C /* FeatureFlags+Generated.swift */, - F9C5CB59289453B200548EEE /* FeatureFlags.swift */, F9C5CB45289453B200548EEE /* RemoteConfigManager.swift */, 50E642C829E4E9CD00566D5D /* SSKEnvironment.swift */, F9C5CB97289453B200548EEE /* TSConstants.swift */, @@ -17793,6 +17793,8 @@ F9C5CC31289453B300548EEE /* BlockingManager.swift in Sources */, F9C5CC74289453B300548EEE /* BlurHash.swift in Sources */, 668FE09B28B923A4008B9071 /* Bool+SSK.swift in Sources */, + 505F76332BC45C0700B1B51C /* BuildFlags+Generated.swift in Sources */, + F9C5CE2B289453B400548EEE /* BuildFlags.swift in Sources */, D9F9A63B2BFFFCC400EF13EC /* BulkDeleteInteractionJobQueue.swift in Sources */, D9F9A6392BFFC84300EF13EC /* BulkDeleteInteractionJobRecord.swift in Sources */, E7D7C93F28B580AC003F043B /* Bundle+OWS.swift in Sources */, @@ -17969,8 +17971,6 @@ F9C5CE60289453B400548EEE /* FakeContactsManager.swift in Sources */, F94BFA9528EBB0D800A5F34E /* FakeMessageSender.swift in Sources */, F9C5CE54289453B400548EEE /* FakeStorageServiceManager.swift in Sources */, - 505F76332BC45C0700B1B51C /* FeatureFlags+Generated.swift in Sources */, - F9C5CE2B289453B400548EEE /* FeatureFlags.swift in Sources */, 7254651B2BA00F8D00EABFD2 /* FetchedSystemContacts.swift in Sources */, F97121EA2903244700C0F5F2 /* FiatMoney.swift in Sources */, F9C5CC91289453B300548EEE /* Fingerprint.pb.swift in Sources */, diff --git a/Signal/AppLaunch/AppDelegate.swift b/Signal/AppLaunch/AppDelegate.swift index 4c11e3ac7a..a4c68d95a8 100644 --- a/Signal/AppLaunch/AppDelegate.swift +++ b/Signal/AppLaunch/AppDelegate.swift @@ -478,7 +478,7 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { ) let finalContinuation = await dataMigrationContinuation.migrateDatabaseData() finalContinuation.runLaunchTasksIfNeededAndReloadCaches() - guard FeatureFlags.runTSAttachmentMigrationBlockingOnLaunch else { + guard BuildFlags.runTSAttachmentMigrationBlockingOnLaunch else { return (finalContinuation, sleepBlockObject) } @@ -1802,7 +1802,7 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { private func checkDatabaseIntegrityIfNecessary( isRegistered: Bool ) { - guard isRegistered, FeatureFlags.periodicallyCheckDatabaseIntegrity else { return } + guard isRegistered, BuildFlags.periodicallyCheckDatabaseIntegrity else { return } let appReadiness: AppReadiness = self.appReadiness DispatchQueue.sharedUtility.async { diff --git a/Signal/Backups/BackupEnablingManager.swift b/Signal/Backups/BackupEnablingManager.swift index a84a3a964c..3f5b1956be 100644 --- a/Signal/Backups/BackupEnablingManager.swift +++ b/Signal/Backups/BackupEnablingManager.swift @@ -114,7 +114,7 @@ final class BackupEnablingManager { case .free: try await setBackupPlan { _ in .free } case .paid: - if FeatureFlags.Backups.avoidStoreKitForTesters { + if BuildFlags.Backups.avoidStoreKitForTesters { try await enablePaidPlanWithoutStoreKit() } else { try await enablePaidPlanWithStoreKit() diff --git a/Signal/Backups/BackupSettingsViewController.swift b/Signal/Backups/BackupSettingsViewController.swift index 0bec190781..94742333cd 100644 --- a/Signal/Backups/BackupSettingsViewController.swift +++ b/Signal/Backups/BackupSettingsViewController.swift @@ -1521,7 +1521,7 @@ struct BackupSettingsView: View { viewModel: viewModel, ) - if FeatureFlags.Backups.showOptimizeMedia { + if BuildFlags.Backups.showOptimizeMedia { Toggle( OWSLocalizedString( "BACKUP_SETTINGS_OPTIMIZE_LOCAL_STORAGE_TOGGLE_TITLE", @@ -1534,7 +1534,7 @@ struct BackupSettingsView: View { ).disabled(!viewModel.optimizeLocalStorageAvailable) } } footer: { - if FeatureFlags.Backups.showOptimizeMedia { + if BuildFlags.Backups.showOptimizeMedia { let footerText: String = if viewModel.optimizeLocalStorageAvailable, viewModel.isPaidPlanTester diff --git a/Signal/Backups/ChooseBackupPlanViewController.swift b/Signal/Backups/ChooseBackupPlanViewController.swift index 2c9c7a1c97..7ed7e2598b 100644 --- a/Signal/Backups/ChooseBackupPlanViewController.swift +++ b/Signal/Backups/ChooseBackupPlanViewController.swift @@ -79,7 +79,7 @@ class ChooseBackupPlanViewController: HostingController { from: fromViewController, ) { () throws(ActionSheetDisplayableError) in let storeKitAvailability: StoreKitAvailability - if FeatureFlags.Backups.avoidStoreKitForTesters { + if BuildFlags.Backups.avoidStoreKitForTesters { storeKitAvailability = .unavailableForTesters } else { do { diff --git a/Signal/Calls/UserInterface/CallsListViewController.swift b/Signal/Calls/UserInterface/CallsListViewController.swift index 23f2c92f10..e70061b62f 100644 --- a/Signal/Calls/UserInterface/CallsListViewController.swift +++ b/Signal/Calls/UserInterface/CallsListViewController.swift @@ -116,7 +116,7 @@ class CallsListViewController: OWSViewController, HomeTabViewController, CallSer updateBarButtonItems() OWSTableViewController2.removeBackButtonText(viewController: self) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { toolbarDeleteButton.image = UIImage(resource: .trash) self.toolbarItems = [.flexibleSpace(), toolbarDeleteButton] } @@ -228,7 +228,7 @@ class CallsListViewController: OWSViewController, HomeTabViewController, CallSer ) private func showToolbar() { - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { navigationController?.setToolbarHidden(false, animated: true) (tabBarController as? HomeTabBarController)?.setTabBarHidden(true) return @@ -346,7 +346,7 @@ class CallsListViewController: OWSViewController, HomeTabViewController, CallSer } private func hideToolbar() { - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { self.navigationController?.setToolbarHidden(true, animated: true) (self.tabBarController as? HomeTabBarController)?.setTabBarHidden(false) return @@ -2290,7 +2290,7 @@ private extension CallsListViewController { private func makeJoinButton(viewModel: CallViewModel) -> UIButton { var config = UIButton.Configuration.borderedProminent() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { #if compiler(>=6.2) config = UIButton.Configuration.prominentGlass() #endif diff --git a/Signal/ConversationView/ConversationInputToolbar+VoiceMemo.swift b/Signal/ConversationView/ConversationInputToolbar+VoiceMemo.swift index 7d1a04558c..ae3a5ae721 100644 --- a/Signal/ConversationView/ConversationInputToolbar+VoiceMemo.swift +++ b/Signal/ConversationView/ConversationInputToolbar+VoiceMemo.swift @@ -46,7 +46,7 @@ extension ConversationInputToolbar { visualEffectView.frame = bounds var cantUseCornerConfiguration = true - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { cantUseCornerConfiguration = false } if cantUseCornerConfiguration { diff --git a/Signal/ConversationView/ConversationViewController+CVComponentDelegate.swift b/Signal/ConversationView/ConversationViewController+CVComponentDelegate.swift index 059027ba26..058e1e9342 100644 --- a/Signal/ConversationView/ConversationViewController+CVComponentDelegate.swift +++ b/Signal/ConversationView/ConversationViewController+CVComponentDelegate.swift @@ -110,7 +110,7 @@ extension ConversationViewController: CVComponentDelegate { itemViewModel: CVItemViewModelImpl, shouldAllowReply: Bool ) { - guard FeatureFlags.pollSend else { + guard BuildFlags.pollSend else { return } diff --git a/Signal/ConversationView/ConversationViewController+ConversationInputToolbarDelegate.swift b/Signal/ConversationView/ConversationViewController+ConversationInputToolbarDelegate.swift index 3cffc5609e..e009f0bb10 100644 --- a/Signal/ConversationView/ConversationViewController+ConversationInputToolbarDelegate.swift +++ b/Signal/ConversationView/ConversationViewController+ConversationInputToolbarDelegate.swift @@ -525,7 +525,7 @@ extension ConversationViewController: ConversationInputToolbarDelegate { public func pollButtonPressed() { AssertIsOnMainThread() - if !FeatureFlags.pollSend { + if !BuildFlags.pollSend { return } diff --git a/Signal/ConversationView/ConversationViewController+UI.swift b/Signal/ConversationView/ConversationViewController+UI.swift index 055d8ddfb9..16a08d75cd 100644 --- a/Signal/ConversationView/ConversationViewController+UI.swift +++ b/Signal/ConversationView/ConversationViewController+UI.swift @@ -80,7 +80,7 @@ extension ConversationViewController { public func updateBarButtonItems() { AssertIsOnMainThread() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { // iOS 26 already doesn't show back button text } else { // Don't include "Back" text on view controllers pushed above us, just use the arrow. @@ -201,7 +201,7 @@ extension ConversationViewController { let subtitleText = NSMutableAttributedString() let subtitleFont = self.headerView.subtitleFont // Use higher-contrast color for the blurred iOS 26 nav bars - let fontColor: UIColor = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let fontColor: UIColor = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { UIColor.Signal.label } else { Theme.navbarTitleColor.withAlphaComponent(0.9) diff --git a/Signal/Emoji/EmojiPickerSectionToolbar.swift b/Signal/Emoji/EmojiPickerSectionToolbar.swift index 4f3bd52beb..872e085551 100644 --- a/Signal/Emoji/EmojiPickerSectionToolbar.swift +++ b/Signal/Emoji/EmojiPickerSectionToolbar.swift @@ -98,7 +98,7 @@ class EmojiPickerSectionToolbar: UIView, UICollectionViewDelegate { } backgroundView.isHidden = !configuration.displayBackgroundView imageView.image = Theme.iconImage(configuration.emojiSectionIcon) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { imageView.tintColor = UIColor.Signal.label } else { imageView.tintColor = UIColor.Signal.secondaryLabel diff --git a/Signal/Registration/RegistrationCoodinatorShims.swift b/Signal/Registration/RegistrationCoodinatorShims.swift index b5ff9c69db..f34c37e6d5 100644 --- a/Signal/Registration/RegistrationCoodinatorShims.swift +++ b/Signal/Registration/RegistrationCoodinatorShims.swift @@ -11,11 +11,11 @@ public import SignalServiceKit extension RegistrationCoordinatorImpl { public enum Shims { + public typealias BuildFlags = _RegistrationCoordinator_BuildFlagsShim public typealias ContactsManager = _RegistrationCoordinator_ContactsManagerShim public typealias ContactsStore = _RegistrationCoordinator_CNContactsStoreShim typealias DeviceTransferService = _RegistrationCoordinator_DeviceTransferServiceShim public typealias ExperienceManager = _RegistrationCoordinator_ExperienceManagerShim - public typealias FeatureFlags = _RegistrationCoordinator_FeatureFlagsShim public typealias IdentityManager = _RegistrationCoordinator_IdentityManagerShim public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorShim public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorShim @@ -30,11 +30,11 @@ extension RegistrationCoordinatorImpl { public typealias UsernameApiClient = _RegistrationCoordinator_UsernameApiClientShim } public enum Wrappers { + public typealias BuildFlags = _RegistrationCoordinator_BuildFlagsWrapper public typealias ContactsManager = _RegistrationCoordinator_ContactsManagerWrapper public typealias ContactsStore = _RegistrationCoordinator_CNContactsStoreWrapper typealias DeviceTransferService = _RegistrationCoordinator_DeviceTransferServiceWrapper public typealias ExperienceManager = _RegistrationCoordinator_ExperienceManagerWrapper - public typealias FeatureFlags = _RegistrationCoordinator_FeatureFlagsWrapper public typealias IdentityManager = _RegistrationCoordinator_IdentityManagerWrapper public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorWrapper public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorWrapper @@ -159,18 +159,18 @@ public class _RegistrationCoordinator_ExperienceManagerWrapper: _RegistrationCoo } } -// MARK: - FeatureFlags +// MARK: - BuildFlags -public protocol _RegistrationCoordinator_FeatureFlagsShim { +public protocol _RegistrationCoordinator_BuildFlagsShim { var backupSupported: Bool { get } } -public class _RegistrationCoordinator_FeatureFlagsWrapper: _RegistrationCoordinator_FeatureFlagsShim { +public class _RegistrationCoordinator_BuildFlagsWrapper: _RegistrationCoordinator_BuildFlagsShim { public init() {} - public var backupSupported: Bool { FeatureFlags.Backups.supported } + public var backupSupported: Bool { BuildFlags.Backups.supported } } public protocol _RegistrationCoordinator_IdentityManagerShim { diff --git a/Signal/Registration/RegistrationCoordinatorDependencies.swift b/Signal/Registration/RegistrationCoordinatorDependencies.swift index c39c1f8e69..a65f188d5c 100644 --- a/Signal/Registration/RegistrationCoordinatorDependencies.swift +++ b/Signal/Registration/RegistrationCoordinatorDependencies.swift @@ -14,6 +14,7 @@ public struct RegistrationCoordinatorDependencies { public let backupIdService: BackupIdService public let backupNonceStore: BackupNonceMetadataStore public let backupRequestManager: BackupRequestManager + public let buildFlags: RegistrationCoordinatorImpl.Shims.BuildFlags public let changeNumberPniManager: ChangePhoneNumberPniManager public let contactsManager: RegistrationCoordinatorImpl.Shims.ContactsManager public let contactsStore: RegistrationCoordinatorImpl.Shims.ContactsStore @@ -21,7 +22,6 @@ public struct RegistrationCoordinatorDependencies { public let db: any DB let deviceTransferService: RegistrationCoordinatorImpl.Shims.DeviceTransferService public let experienceManager: RegistrationCoordinatorImpl.Shims.ExperienceManager - public let featureFlags: RegistrationCoordinatorImpl.Shims.FeatureFlags public let identityManager: RegistrationCoordinatorImpl.Shims.IdentityManager public let localUsernameManager: LocalUsernameManager public let messagePipelineSupervisor: RegistrationCoordinatorImpl.Shims.MessagePipelineSupervisor @@ -58,6 +58,7 @@ public struct RegistrationCoordinatorDependencies { backupIdService: DependenciesBridge.shared.backupIdService, backupNonceStore: BackupNonceMetadataStore(), backupRequestManager: DependenciesBridge.shared.backupRequestManager, + buildFlags: RegistrationCoordinatorImpl.Wrappers.BuildFlags(), changeNumberPniManager: DependenciesBridge.shared.changePhoneNumberPniManager, contactsManager: RegistrationCoordinatorImpl.Wrappers.ContactsManager(SSKEnvironment.shared.contactManagerImplRef), contactsStore: RegistrationCoordinatorImpl.Wrappers.ContactsStore(), @@ -65,7 +66,6 @@ public struct RegistrationCoordinatorDependencies { db: DependenciesBridge.shared.db, deviceTransferService: RegistrationCoordinatorImpl.Wrappers.DeviceTransferService(AppEnvironment.shared.deviceTransferServiceRef), experienceManager: RegistrationCoordinatorImpl.Wrappers.ExperienceManager(), - featureFlags: RegistrationCoordinatorImpl.Wrappers.FeatureFlags(), identityManager: RegistrationCoordinatorImpl.Wrappers.IdentityManager(DependenciesBridge.shared.identityManager), localUsernameManager: DependenciesBridge.shared.localUsernameManager, messagePipelineSupervisor: RegistrationCoordinatorImpl.Wrappers.MessagePipelineSupervisor(SSKEnvironment.shared.messagePipelineSupervisorRef), diff --git a/Signal/Registration/RegistrationCoordinatorImpl.swift b/Signal/Registration/RegistrationCoordinatorImpl.swift index f9b4fc873b..3a481fefca 100644 --- a/Signal/Registration/RegistrationCoordinatorImpl.swift +++ b/Signal/Registration/RegistrationCoordinatorImpl.swift @@ -1888,7 +1888,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { } if inMemoryState.needsToAskForDeviceTransfer && persistedState.restoreMethod == nil { - if deps.featureFlags.backupSupported { + if deps.buildFlags.backupSupported { return .chooseRestoreMethod(.unspecified) } else if !persistedState.hasDeclinedTransfer { return .transferSelection @@ -2420,7 +2420,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { } if inMemoryState.needsToAskForDeviceTransfer && !persistedState.hasDeclinedTransfer { - if deps.featureFlags.backupSupported { + if deps.buildFlags.backupSupported { return .chooseRestoreMethod(.unspecified) } else { return .transferSelection @@ -2741,7 +2741,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { return await nextStep() case .deviceTransferPossible: inMemoryState.needsToAskForDeviceTransfer = true - if deps.featureFlags.backupSupported { + if deps.buildFlags.backupSupported { return .chooseRestoreMethod(.unspecified) } else { return .transferSelection @@ -4934,7 +4934,7 @@ public class RegistrationCoordinatorImpl: RegistrationCoordinator { switch mode { case .registering: return - deps.featureFlags.backupSupported + deps.buildFlags.backupSupported && inMemoryState.accountEntropyPool != nil && inMemoryState.hasBackedUpToSVR && inMemoryState.backupRestoreState == .none diff --git a/Signal/Registration/RegistrationCoordinatorLoader.swift b/Signal/Registration/RegistrationCoordinatorLoader.swift index f815399d84..ee9c2c98d9 100644 --- a/Signal/Registration/RegistrationCoordinatorLoader.swift +++ b/Signal/Registration/RegistrationCoordinatorLoader.swift @@ -272,7 +272,7 @@ extension RegistrationCoordinatorLoaderImpl.Mode.ChangeNumberState.PendingPniSta if let modernValue = try container.decodeIfPresent(Data.self, forKey: .localDevicePniPqLastResortPreKeyRecordData) { self.localDevicePniPqLastResortPreKeyRecord = .success(try LibSignalClient.KyberPreKeyRecord(bytes: modernValue)) } else if - FeatureFlags.decodeDeprecatedPreKeys, + BuildFlags.decodeDeprecatedPreKeys, let deprecatedValue = try container.decodeIfPresent(KyberRecordKeyData.self, forKey: .localDevicePniPqLastResortPreKeyRecord) { self.localDevicePniPqLastResortPreKeyRecord = .success(try LibSignalClient.KyberPreKeyRecord(bytes: deprecatedValue.keyData)) @@ -290,7 +290,7 @@ extension RegistrationCoordinatorLoaderImpl.Mode.ChangeNumberState.PendingPniSta if let modernValue = try container.decodeIfPresent(Data.self, forKey: .localDevicePniSignedPreKeyRecordData) { self.localDevicePniSignedPreKeyRecord = .success(try LibSignalClient.SignedPreKeyRecord(bytes: modernValue)) } else if - FeatureFlags.decodeDeprecatedPreKeys, + BuildFlags.decodeDeprecatedPreKeys, let deprecatedValue = try container.decodeIfPresent(Data.self, forKey: .localDevicePniSignedPreKeyRecord) { guard let signedPreKeyRecord = try NSKeyedUnarchiver.unarchivedObject(ofClass: SignalServiceKit.SignedPreKeyRecord.self, from: deprecatedValue) else { diff --git a/Signal/Registration/UserInterface/RegistrationSplashViewController.swift b/Signal/Registration/UserInterface/RegistrationSplashViewController.swift index a4d4ae322e..355e81fe3f 100644 --- a/Signal/Registration/UserInterface/RegistrationSplashViewController.swift +++ b/Signal/Registration/UserInterface/RegistrationSplashViewController.swift @@ -38,7 +38,7 @@ public class RegistrationSplashViewController: OWSViewController, OWSNavigationC view.backgroundColor = .Signal.background // Buttons in the top right corner. - let canSwitchModes = UIDevice.current.isIPad || FeatureFlags.linkedPhones + let canSwitchModes = UIDevice.current.isIPad || BuildFlags.linkedPhones var transferButtonTrailingAnchor: NSLayoutAnchor = contentLayoutGuide.trailingAnchor if canSwitchModes { let modeSwitchButton = UIButton( @@ -63,7 +63,7 @@ public class RegistrationSplashViewController: OWSViewController, OWSNavigationC transferButtonTrailingAnchor = modeSwitchButton.leadingAnchor } - if FeatureFlags.preRegDeviceTransfer { + if BuildFlags.preRegDeviceTransfer { let transferButton = UIButton( configuration: .plain(), primaryAction: UIAction { [weak self] _ in @@ -140,7 +140,7 @@ public class RegistrationSplashViewController: OWSViewController, OWSNavigationC continueButton.accessibilityIdentifier = "registration.splash.continueButton" let largeButtonsContainer: UIView - if FeatureFlags.Backups.supported { + if BuildFlags.Backups.supported { let restoreOrTransferButton = UIButton( configuration: .largeSecondary(title: OWSLocalizedString( "ONBOARDING_SPLASH_RESTORE_OR_TRANSFER_BUTTON_TITLE", diff --git a/Signal/src/BackupBGProcessingTaskRunner.swift b/Signal/src/BackupBGProcessingTaskRunner.swift index f252d0d1ff..322bf3b01d 100644 --- a/Signal/src/BackupBGProcessingTaskRunner.swift +++ b/Signal/src/BackupBGProcessingTaskRunner.swift @@ -67,7 +67,7 @@ class BackupBGProcessingTaskRunner: BGProcessingTaskRunner { } public func startCondition() -> BGProcessingTaskStartCondition { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return .never } diff --git a/Signal/src/View Supplements/ContextualActionBuilder.swift b/Signal/src/View Supplements/ContextualActionBuilder.swift index 362714de03..000398c5c8 100644 --- a/Signal/src/View Supplements/ContextualActionBuilder.swift +++ b/Signal/src/View Supplements/ContextualActionBuilder.swift @@ -37,7 +37,7 @@ enum ContextualActionBuilder { // We want to always show a title with the icon. iOS 26 does this by // default, but previous iOS versions only does when the cell's // height > 91, so we generate an image with the text below it. - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { let action = UIContextualAction( style: style, title: title diff --git a/Signal/src/ViewControllers/AppSettings/Donations/PaypalButton.swift b/Signal/src/ViewControllers/AppSettings/Donations/PaypalButton.swift index 64d8eccb31..0381986b8e 100644 --- a/Signal/src/ViewControllers/AppSettings/Donations/PaypalButton.swift +++ b/Signal/src/ViewControllers/AppSettings/Donations/PaypalButton.swift @@ -30,7 +30,7 @@ class PaypalButton: UIButton { setImage(UIImage(named: "paypal-logo"), for: .normal) ows_adjustsImageWhenDisabled = false ows_adjustsImageWhenHighlighted = false - if #available(iOS 26.0, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26.0, *), BuildFlags.iOS26SDKIsAvailable { #if compiler(>=6.2) configuration = .prominentGlass() tintColor = UIColor(rgbHex: 0xF6C757) diff --git a/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift b/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift index 470deca614..8b3a9b8b03 100644 --- a/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift +++ b/Signal/src/ViewControllers/AppSettings/Internal/InternalSettingsViewController.swift @@ -143,7 +143,7 @@ class InternalSettingsViewController: OWSTableViewController2 { } }) } - if FeatureFlags.Backups.showOptimizeMedia { + if BuildFlags.Backups.showOptimizeMedia { backupsSection.add(.switch( withText: "Offload all attachments", subtitle: "If on and \"Optimize Storage\" enabled, offload all attachments instead of only those >30d old", @@ -267,7 +267,7 @@ class InternalSettingsViewController: OWSTableViewController2 { let buildSection = OWSTableSection(title: "Build") buildSection.add(.copyableItem(label: "Environment", value: TSConstants.isUsingProductionService ? "Production" : "Staging")) - buildSection.add(.copyableItem(label: "Variant", value: FeatureFlags.buildVariantString)) + buildSection.add(.copyableItem(label: "Variant", value: BuildFlags.buildVariantString)) buildSection.add(.copyableItem(label: "Current Version", value: AppVersionImpl.shared.currentAppVersion)) buildSection.add(.copyableItem(label: "First Version", value: AppVersionImpl.shared.firstAppVersion)) if let buildDetails = Bundle.main.object(forInfoDictionaryKey: "BuildDetails") as? [String: AnyObject] { diff --git a/Signal/src/ViewControllers/Attachment Keyboard/AttachmentFormatPickerView.swift b/Signal/src/ViewControllers/Attachment Keyboard/AttachmentFormatPickerView.swift index b15decc304..0d8d7b314d 100644 --- a/Signal/src/ViewControllers/Attachment Keyboard/AttachmentFormatPickerView.swift +++ b/Signal/src/ViewControllers/Attachment Keyboard/AttachmentFormatPickerView.swift @@ -195,7 +195,7 @@ class AttachmentFormatPickerView: UIView { } private static var groupCases: [AttachmentType] { - if !FeatureFlags.pollSend { + if !BuildFlags.pollSend { return cases(except: [.payment, .poll]) } return cases(except: [.payment]) @@ -251,7 +251,7 @@ class AttachmentFormatPickerView: UIView { let button: UIButton = { let button: UIButton - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { #if compiler(>=6.2) button = UIButton(configuration: .glass()) #else diff --git a/Signal/src/ViewControllers/BackupArchive/BackupArchiveInternalErrorViewController.swift b/Signal/src/ViewControllers/BackupArchive/BackupArchiveInternalErrorViewController.swift index 6fa40ae271..8c9cfbb390 100644 --- a/Signal/src/ViewControllers/BackupArchive/BackupArchiveInternalErrorViewController.swift +++ b/Signal/src/ViewControllers/BackupArchive/BackupArchiveInternalErrorViewController.swift @@ -48,7 +48,7 @@ class BackupArchiveErrorPresenterInternal: BackupArchiveErrorPresenter { didFail: Bool, tx outerTx: DBWriteTransaction ) { - guard FeatureFlags.Backups.errorDisplay else { + guard BuildFlags.Backups.errorDisplay else { return } @@ -96,7 +96,7 @@ class BackupArchiveErrorPresenterInternal: BackupArchiveErrorPresenter { } func presentOverTopmostViewController(completion: @escaping () -> Void) { - guard FeatureFlags.Backups.errorDisplay else { + guard BuildFlags.Backups.errorDisplay else { completion() return } diff --git a/Signal/src/ViewControllers/ContextMenus/CustomContextMenus/ContextMenuActionsAccessory.swift b/Signal/src/ViewControllers/ContextMenus/CustomContextMenus/ContextMenuActionsAccessory.swift index babcd36d9f..51e88b59c8 100644 --- a/Signal/src/ViewControllers/ContextMenus/CustomContextMenus/ContextMenuActionsAccessory.swift +++ b/Signal/src/ViewControllers/ContextMenus/CustomContextMenus/ContextMenuActionsAccessory.swift @@ -162,7 +162,7 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr if highlightedView == nil { let view = UIView() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { #if compiler(>=6.2) view.frame = bounds.insetBy(dx: 12, dy: 4) view.cornerConfiguration = .capsule() @@ -189,14 +189,14 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr } var maxWidth: CGFloat = 250 - let margin: CGFloat = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let margin: CGFloat = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { 24 } else { 16 } let iconSpacing: CGFloat = 12 let verticalPadding: CGFloat = 23 - let iconSize: CGFloat = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let iconSize: CGFloat = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { 24 } else { 20 @@ -303,7 +303,7 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr } titleFrame.width = titleWidth - let iconIsToTheRightOfText = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let iconIsToTheRightOfText = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { isRTL } else { !isRTL @@ -357,13 +357,13 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr } } - let cornerRadius: CGFloat = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let cornerRadius: CGFloat = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { 33 } else { 12 } - let vMargin: CGFloat = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let vMargin: CGFloat = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { 10 } else { 0 @@ -380,13 +380,13 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr scrollView.verticalScrollIndicatorInsets = .init(hMargin: 0, vMargin: cornerRadius) let blurEffect: UIBlurEffect? - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { #if compiler(>=6.2) let effect = UIGlassEffect(style: .clear) effect.isInteractive = true backdropView = UIVisualEffectView(effect: effect) #else - // will never execute because of the FeatureFlags.iOS26SDKIsAvailable check above, but needed for the Xcode 16 compiler to not get mad. Remove when CI is all Xcode 26 + // will never execute because of the BuildFlags.iOS26SDKIsAvailable check above, but needed for the Xcode 16 compiler to not get mad. Remove when CI is all Xcode 26 backdropView = UIVisualEffectView(effect: UIBlurEffect(style: .systemThinMaterial)) #endif blurEffect = nil @@ -427,7 +427,7 @@ private class ContextMenuActionsView: UIView, UIGestureRecognizerDelegate, UIScr addGestureRecognizer(highlightHoverGestureRecognizer) self.highlightHoverGestureRecognizer = highlightHoverGestureRecognizer - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { } else { layer.cornerRadius = cornerRadius layer.shadowRadius = 64 diff --git a/Signal/src/ViewControllers/HomeView/Chat List/CLVLoader.swift b/Signal/src/ViewControllers/HomeView/Chat List/CLVLoader.swift index 5a40584ee6..ae1aca3543 100644 --- a/Signal/src/ViewControllers/HomeView/Chat List/CLVLoader.swift +++ b/Signal/src/ViewControllers/HomeView/Chat List/CLVLoader.swift @@ -78,7 +78,7 @@ public class CLVLoader { .pinnedThreadIds(tx: transaction) let visibleThreadUniqueIds: [String] - if FeatureFlags.moveDraftsUpChatList { + if BuildFlags.moveDraftsUpChatList { if isViewingArchive { visibleThreadUniqueIds = try threadFinder.internal_visibleArchivedThreadIds(transaction: transaction) } else { diff --git a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Helpers.swift b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Helpers.swift index c002f4ec7e..9911e4fe9d 100644 --- a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Helpers.swift +++ b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Helpers.swift @@ -148,7 +148,7 @@ public extension ChatListViewController { func applyArchiveBackButton() { AssertIsOnMainThread() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { return } + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { return } navigationItem.backBarButtonItem = UIBarButtonItem(title: CommonStrings.backButton, style: .plain, diff --git a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Multiselect.swift b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Multiselect.swift index a58bbf8606..9423f55a98 100644 --- a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Multiselect.swift +++ b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController+Multiselect.swift @@ -69,7 +69,7 @@ extension ChatListViewController { func showToolbar() { AssertIsOnMainThread() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { self.updateCaptions() self.navigationController?.setToolbarHidden(false, animated: true) (self.tabBarController as? HomeTabBarController)?.setTabBarHidden(true) @@ -149,7 +149,7 @@ extension ChatListViewController { let archiveBtn = UIBarButtonItem( title: viewState.chatListMode == .archive ? CommonStrings.unarchiveAction : CommonStrings.archiveAction, style: .plain, target: self, action: #selector(performArchive)) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { archiveBtn.image = UIImage(resource: .archive) } archiveBtn.isEnabled = hasSelectedEntries @@ -186,7 +186,7 @@ extension ChatListViewController { } let deleteBtn = UIBarButtonItem(title: CommonStrings.deleteButton, style: .plain, target: self, action: #selector(performDelete)) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { deleteBtn.image = UIImage(resource: .trash) } deleteBtn.isEnabled = hasSelectedEntries @@ -204,7 +204,7 @@ extension ChatListViewController { private func hideToolbar() { AssertIsOnMainThread() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { (self.tabBarController as? HomeTabBarController)?.setTabBarHidden(false) self.navigationController?.setToolbarHidden(true, animated: true) return @@ -242,7 +242,7 @@ extension ChatListViewController { title = String.localizedStringWithFormat(format, count) } - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { toolbarItems = makeToolbarButtons() } else { viewState.multiSelectState.toolbar?.toolbar.setItems( diff --git a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController.swift b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController.swift index 8c90a02838..4879bd2d0d 100644 --- a/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController.swift +++ b/Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController.swift @@ -730,7 +730,7 @@ public class ChatListViewController: OWSViewController, HomeTabViewController { private func applyDefaultBackButton() { AssertIsOnMainThread() - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { return } + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { return } // We don't show any text for the back button, so there's no need to localize it. But because we left align the // conversation title view, we add a little tappable padding after the back button, by having a title of spaces. diff --git a/Signal/src/ViewControllers/HomeView/ConversationSplitViewController.swift b/Signal/src/ViewControllers/HomeView/ConversationSplitViewController.swift index 56d822967f..6f5710b4df 100644 --- a/Signal/src/ViewControllers/HomeView/ConversationSplitViewController.swift +++ b/Signal/src/ViewControllers/HomeView/ConversationSplitViewController.swift @@ -739,7 +739,7 @@ private class NoSelectedConversationViewController: OWSViewController { extension ConversationSplitViewController: DeviceTransferServiceObserver { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - if !FeatureFlags.Backups.supported { + if !BuildFlags.Backups.supported { AppEnvironment.shared.deviceTransferServiceRef.addObserver(self) AppEnvironment.shared.deviceTransferServiceRef.startListeningForNewDevices() } @@ -756,7 +756,7 @@ extension ConversationSplitViewController: DeviceTransferServiceObserver { override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - if !FeatureFlags.Backups.supported { + if !BuildFlags.Backups.supported { AppEnvironment.shared.deviceTransferServiceRef.removeObserver(self) AppEnvironment.shared.deviceTransferServiceRef.stopListeningForNewDevices() } diff --git a/Signal/src/ViewControllers/HomeView/HomeTabBarController.swift b/Signal/src/ViewControllers/HomeView/HomeTabBarController.swift index 0d39095c85..93a8190fe6 100644 --- a/Signal/src/ViewControllers/HomeView/HomeTabBarController.swift +++ b/Signal/src/ViewControllers/HomeView/HomeTabBarController.swift @@ -415,7 +415,7 @@ public class OWSTabBar: UITabBar { return } - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { return } diff --git a/Signal/src/ViewControllers/HomeView/HomeTabViewController.swift b/Signal/src/ViewControllers/HomeView/HomeTabViewController.swift index 941be6cb3f..713452372c 100644 --- a/Signal/src/ViewControllers/HomeView/HomeTabViewController.swift +++ b/Signal/src/ViewControllers/HomeView/HomeTabViewController.swift @@ -40,7 +40,7 @@ extension HomeTabViewController { contextButton.delegate = delegate let sizeClass: ConversationAvatarView.Configuration.SizeClass - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { sizeClass = isInFloatingSidebar ? .thirtyTwo : .forty } else { sizeClass = .twentyEight diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift index 94bece39b3..8661903b5a 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationSettingsViewController.swift @@ -919,7 +919,7 @@ class ConversationSettingsViewController: OWSTableViewController2, BadgeCollecti let imageView = UIImageView() imageView.clipsToBounds = true - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { imageView.layer.cornerCurve = .continuous imageView.layer.cornerRadius = 11 } else { diff --git a/Signal/src/views/JoinGroupCallPill.swift b/Signal/src/views/JoinGroupCallPill.swift index 447c5a0850..df26890b6b 100644 --- a/Signal/src/views/JoinGroupCallPill.swift +++ b/Signal/src/views/JoinGroupCallPill.swift @@ -60,7 +60,7 @@ class JoinGroupCallPill: UIControl { contentStack.isLayoutMarginsRelativeArrangement = true contentStack.layoutMargins = .init(hMargin: 12, vMargin: 4) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { addSubview(contentStack) contentStack.autoPinEdgesToSuperviewEdges() } else { @@ -99,7 +99,7 @@ class JoinGroupCallPill: UIControl { callLabel.textColor = isEnabled ? enabledColor : .ows_whiteAlpha40 callImageView.tintColor = isEnabled ? enabledColor : .ows_whiteAlpha40 - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { } else { // When we're highlighted, we should unhide the dimming view to darken the pill dimmingView.isHidden = !isHighlighted diff --git a/Signal/test/Registration/RegistrationCoordinatorTest.swift b/Signal/test/Registration/RegistrationCoordinatorTest.swift index 134ef1c9e8..7f03963bd2 100644 --- a/Signal/test/Registration/RegistrationCoordinatorTest.swift +++ b/Signal/test/Registration/RegistrationCoordinatorTest.swift @@ -19,12 +19,12 @@ public class RegistrationCoordinatorTest { private var date: Date { self.stubs.date } private var appExpiry: AppExpiry! + private var buildFlags: RegistrationCoordinatorImpl.TestMocks.BuildFlags! private var changeNumberPniManager: ChangePhoneNumberPniManagerMock! private var contactsStore: RegistrationCoordinatorImpl.TestMocks.ContactsStore! private var dateProvider: DateProvider! private var db: (any DB)! private var experienceManager: RegistrationCoordinatorImpl.TestMocks.ExperienceManager! - private var featureFlags: RegistrationCoordinatorImpl.TestMocks.FeatureFlags! private var accountKeyStore: AccountKeyStore! private var localUsernameManagerMock: MockLocalUsernameManager! private var mockMessagePipelineSupervisor: RegistrationCoordinatorImpl.TestMocks.MessagePipelineSupervisor! @@ -62,6 +62,7 @@ public class RegistrationCoordinatorTest { db = InMemoryDB() appExpiry = .forUnitTests() + buildFlags = RegistrationCoordinatorImpl.TestMocks.BuildFlags() accountKeyStore = AccountKeyStore(backupSettingsStore: BackupSettingsStore()) let preKeyStore = PreKeyStore() changeNumberPniManager = ChangePhoneNumberPniManagerMock( @@ -69,7 +70,6 @@ public class RegistrationCoordinatorTest { ) contactsStore = RegistrationCoordinatorImpl.TestMocks.ContactsStore() experienceManager = RegistrationCoordinatorImpl.TestMocks.ExperienceManager() - featureFlags = RegistrationCoordinatorImpl.TestMocks.FeatureFlags() localUsernameManagerMock = { let mock = MockLocalUsernameManager() // This should result in no username reclamation. Tests that want to @@ -112,6 +112,7 @@ public class RegistrationCoordinatorTest { backupIdService: MockBackupIdService(), backupNonceStore: BackupNonceMetadataStore(), backupRequestManager: BackupRequestManagerMock(), + buildFlags: buildFlags, changeNumberPniManager: changeNumberPniManager, contactsManager: RegistrationCoordinatorImpl.TestMocks.ContactsManager(), contactsStore: contactsStore, @@ -119,7 +120,6 @@ public class RegistrationCoordinatorTest { db: db, deviceTransferService: RegistrationCoordinatorImpl.TestMocks.DeviceTransferService(), experienceManager: experienceManager, - featureFlags: featureFlags, identityManager: RegistrationCoordinatorImpl.TestMocks.IdentityManager(), localUsernameManager: localUsernameManagerMock, messagePipelineSupervisor: mockMessagePipelineSupervisor, diff --git a/Signal/test/Registration/RegistrationCoordinatorTestShims.swift b/Signal/test/Registration/RegistrationCoordinatorTestShims.swift index a25e153cd8..0e8d9ebdfe 100644 --- a/Signal/test/Registration/RegistrationCoordinatorTestShims.swift +++ b/Signal/test/Registration/RegistrationCoordinatorTestShims.swift @@ -11,11 +11,11 @@ import LibSignalClient extension RegistrationCoordinatorImpl { public enum TestMocks { + public typealias BuildFlags = _RegistrationCoordinator_BuildFlagsMock public typealias ContactsManager = _RegistrationCoordinator_ContactsManagerMock public typealias ContactsStore = _RegistrationCoordinator_CNContactsStoreMock public typealias DeviceTransferService = _RegistrationCoordinator_DeviceTransferServiceMock public typealias ExperienceManager = _RegistrationCoordinator_ExperienceManagerMock - public typealias FeatureFlags = _RegistrationCoordinator_FeatureFlagsMock public typealias IdentityManager = _RegistrationCoordinator_IdentityManagerMock public typealias MessagePipelineSupervisor = _RegistrationCoordinator_MessagePipelineSupervisorMock public typealias MessageProcessor = _RegistrationCoordinator_MessageProcessorMock @@ -101,7 +101,7 @@ public class _RegistrationCoordinator_ExperienceManagerMock: _RegistrationCoordi } } -public class _RegistrationCoordinator_FeatureFlagsMock: _RegistrationCoordinator_FeatureFlagsShim { +public class _RegistrationCoordinator_BuildFlagsMock: _RegistrationCoordinator_BuildFlagsShim { public init() {} diff --git a/SignalServiceKit/Account/PreKeys/PrekeyManagerImpl.swift b/SignalServiceKit/Account/PreKeys/PrekeyManagerImpl.swift index 1ef5ad940e..0a950730f6 100644 --- a/SignalServiceKit/Account/PreKeys/PrekeyManagerImpl.swift +++ b/SignalServiceKit/Account/PreKeys/PrekeyManagerImpl.swift @@ -19,7 +19,7 @@ public class PreKeyManagerImpl: PreKeyManager { // Maximum amount of time that can elapse without rotating signed prekeys // before the message sending is disabled. static let SignedPreKeyMaxRotationDuration: TimeInterval = ( - FeatureFlags.shouldUseTestIntervals ? (4 * .day) : (14 * .day) + BuildFlags.shouldUseTestIntervals ? (4 * .day) : (14 * .day) ) /// Maximum amount of time a pre key can be used before a new one will be diff --git a/SignalServiceKit/Backups/Archiving/Archivers/AccountData/BackupArchiveAccountDataArchiver.swift b/SignalServiceKit/Backups/Archiving/Archivers/AccountData/BackupArchiveAccountDataArchiver.swift index e7709aeff1..a02d49e857 100644 --- a/SignalServiceKit/Backups/Archiving/Archivers/AccountData/BackupArchiveAccountDataArchiver.swift +++ b/SignalServiceKit/Backups/Archiving/Archivers/AccountData/BackupArchiveAccountDataArchiver.swift @@ -412,7 +412,7 @@ public class BackupArchiveAccountDataArchiver: BackupArchiveProtoStreamWriter { uploadEra = backupAttachmentUploadEraStore.currentUploadEra(tx: context.tx) let optimizeLocalStorage = accountData.accountSettings.optimizeOnDeviceStorage - if FeatureFlags.Backups.avoidStoreKitForTesters { + if BuildFlags.Backups.avoidStoreKitForTesters { // If we're importing into a build that can't make purchases, // opt ourselves into "paid as tester" mode. We'll manage IAP // data, if there is any, separately. diff --git a/SignalServiceKit/Backups/Archiving/Archivers/BackupArchive+Errors.swift b/SignalServiceKit/Backups/Archiving/Archivers/BackupArchive+Errors.swift index 133e1f044a..c637b2b93c 100644 --- a/SignalServiceKit/Backups/Archiving/Archivers/BackupArchive+Errors.swift +++ b/SignalServiceKit/Backups/Archiving/Archivers/BackupArchive+Errors.swift @@ -1187,7 +1187,7 @@ extension BackupArchive { self.error = error self.wasFrameDropped = wasFrameDropped // Don't serialize proto frames if we aren't displaying errors. - if let protoFrame, FeatureFlags.Backups.errorDisplay { + if let protoFrame, BuildFlags.Backups.errorDisplay { do { self.protoJson = try String( data: JSONSerialization.data( diff --git a/SignalServiceKit/Backups/Archiving/BackupArchive+Bench.swift b/SignalServiceKit/Backups/Archiving/BackupArchive+Bench.swift index 763aaa39da..6a5698a752 100644 --- a/SignalServiceKit/Backups/Archiving/BackupArchive+Bench.swift +++ b/SignalServiceKit/Backups/Archiving/BackupArchive+Bench.swift @@ -97,7 +97,7 @@ extension BackupArchive { dbFileSizeProvider: any DBFileSizeProvider, memorySampler: any MemorySampler ) { - self.dbFileSizeBencher = if FeatureFlags.Backups.detailedBenchLogging { + self.dbFileSizeBencher = if BuildFlags.Backups.detailedBenchLogging { DBFileSizeBencher(dateProvider: dateProviderMonotonic, dbFileSizeProvider: dbFileSizeProvider) } else { nil @@ -338,7 +338,7 @@ extension BackupArchive { } private func loggableCountString(_ number: UInt64) -> String { - if FeatureFlags.Backups.detailedBenchLogging { + if BuildFlags.Backups.detailedBenchLogging { return "\(number)" } diff --git a/SignalServiceKit/Backups/Archiving/BackupArchiveManagerImpl.swift b/SignalServiceKit/Backups/Archiving/BackupArchiveManagerImpl.swift index 6651836984..e4ff87de10 100644 --- a/SignalServiceKit/Backups/Archiving/BackupArchiveManagerImpl.swift +++ b/SignalServiceKit/Backups/Archiving/BackupArchiveManagerImpl.swift @@ -26,7 +26,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { public static let supportedBackupVersion: UInt64 = 1 /// The ratio of frames processed for which to sample memory. - fileprivate static let memorySamplerFrameRatio: Float = FeatureFlags.Backups.detailedBenchLogging ? 0.001 : 0 + fileprivate static let memorySamplerFrameRatio: Float = BuildFlags.Backups.detailedBenchLogging ? 0.001 : 0 } private class NotImplementedError: Error {} @@ -341,7 +341,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { public func exportPlaintextBackupForTests( localIdentifiers: LocalIdentifiers, ) async throws -> URL { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { owsFailDebug("Should not be able to use backups!") throw NotImplementedError() } @@ -798,7 +798,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { fileUrl: URL, localIdentifiers: LocalIdentifiers, ) async throws { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { owsFailDebug("Should not be able to use backups!") throw NotImplementedError() } @@ -1128,7 +1128,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { case .protoDeserializationError(let error): // fail the whole thing if we fail to deserialize one frame owsFailDebug("Failed to deserialize proto frame!") - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw error } else { return @@ -1211,7 +1211,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: false, protoFrame: recipient) }) case .failure(let errors): frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: true, protoFrame: recipient) }) - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw BackupError() } } @@ -1230,7 +1230,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: false, protoFrame: chat) }) case .failure(let errors): frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: true, protoFrame: chat) }) - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw BackupError() } } @@ -1249,7 +1249,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: false, protoFrame: chatItem) }) case .failure(let errors): frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: true, protoFrame: chatItem) }) - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw BackupError() } } @@ -1288,7 +1288,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: false, protoFrame: backupProtoStickerPack) }) case .failure(let errors): frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: true, protoFrame: backupProtoStickerPack) }) - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw BackupError() } } @@ -1307,7 +1307,7 @@ public class BackupArchiveManagerImpl: BackupArchiveManager { frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: false, protoFrame: backupProtoAdHocCall) }) case .failure(let errors): frameErrors.append(contentsOf: errors.map { LoggableErrorAndProto(error: $0, wasFrameDropped: true, protoFrame: backupProtoAdHocCall) }) - if FeatureFlags.Backups.restoreFailOnAnyError { + if BuildFlags.Backups.restoreFailOnAnyError { throw BackupError() } } diff --git a/SignalServiceKit/Backups/Attachments/AttachmentOffloadingManager.swift b/SignalServiceKit/Backups/Attachments/AttachmentOffloadingManager.swift index 38466a32ac..eba963a766 100644 --- a/SignalServiceKit/Backups/Attachments/AttachmentOffloadingManager.swift +++ b/SignalServiceKit/Backups/Attachments/AttachmentOffloadingManager.swift @@ -133,7 +133,7 @@ public class AttachmentOffloadingManagerImpl: AttachmentOffloadingManager { } public func offloadAttachmentsIfNeeded() async throws { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } diff --git a/SignalServiceKit/Backups/Attachments/BackupAttachmentDownloadEligibility.swift b/SignalServiceKit/Backups/Attachments/BackupAttachmentDownloadEligibility.swift index 1d097ef2b8..6386c6cac0 100644 --- a/SignalServiceKit/Backups/Attachments/BackupAttachmentDownloadEligibility.swift +++ b/SignalServiceKit/Backups/Attachments/BackupAttachmentDownloadEligibility.swift @@ -152,7 +152,7 @@ public struct BackupAttachmentDownloadEligibility { currentTimestamp: UInt64, backupPlan: BackupPlan ) rethrows -> QueuedBackupAttachmentDownload.State? { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return nil } guard attachment.asStream() == nil else { @@ -217,7 +217,7 @@ public struct BackupAttachmentDownloadEligibility { attachmentTimestamp getAttachmentTimestamp: @autoclosure () throws -> UInt64?, currentTimestamp: UInt64, ) rethrows -> QueuedBackupAttachmentDownload.State? { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return nil } if attachment.mediaName == nil { diff --git a/SignalServiceKit/Backups/Attachments/BackupAttachmentUploadQueueRunner.swift b/SignalServiceKit/Backups/Attachments/BackupAttachmentUploadQueueRunner.swift index 01fe894ec3..060d2e41e7 100644 --- a/SignalServiceKit/Backups/Attachments/BackupAttachmentUploadQueueRunner.swift +++ b/SignalServiceKit/Backups/Attachments/BackupAttachmentUploadQueueRunner.swift @@ -126,7 +126,7 @@ class BackupAttachmentUploadQueueRunnerImpl: BackupAttachmentUploadQueueRunner { logString = "thumbnail" } - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } let (isRegisteredPrimary, localAci, backupPlan, backupKey) = db.read { tx in @@ -307,7 +307,7 @@ class BackupAttachmentUploadQueueRunnerImpl: BackupAttachmentUploadQueueRunner { } func runTask(record: Store.Record, loader: TaskQueueLoader) async -> TaskRecordResult { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return .cancelled } diff --git a/SignalServiceKit/Backups/Attachments/BackupListMediaManager.swift b/SignalServiceKit/Backups/Attachments/BackupListMediaManager.swift index 21076179ca..8a8c231ee7 100644 --- a/SignalServiceKit/Backups/Attachments/BackupListMediaManager.swift +++ b/SignalServiceKit/Backups/Attachments/BackupListMediaManager.swift @@ -189,7 +189,7 @@ public class BackupListMediaManagerImpl: BackupListMediaManager { } private func _queryListMediaIfNeeded() async throws -> ListMediaIntegrityCheckResult? { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return nil } let ( @@ -304,7 +304,7 @@ public class BackupListMediaManagerImpl: BackupListMediaManager { let integrityChecker: ListMediaIntegrityChecker if - FeatureFlags.Backups.performListMediaIntegrityChecks, + BuildFlags.Backups.performListMediaIntegrityChecks, isPrimaryDevice, // Skip integrity checks if we're in a new upload era, since we // expect media to not yet be uploaded. @@ -1130,7 +1130,7 @@ public class BackupListMediaManagerImpl: BackupListMediaManager { remoteConfig: RemoteConfig, tx: DBReadTransaction ) -> Bool { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return false } diff --git a/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentQueueRunner.swift b/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentQueueRunner.swift index 3e18421116..a683a70198 100644 --- a/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentQueueRunner.swift +++ b/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentQueueRunner.swift @@ -110,7 +110,7 @@ public class OrphanedBackupAttachmentQueueRunnerImpl: OrphanedBackupAttachmentQu private let errorCounts = ErrorCounts() func runTask(record: Store.Record, loader: TaskQueueLoader) async -> TaskRecordResult { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return .cancelled } diff --git a/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentScheduler.swift b/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentScheduler.swift index c1d97f6399..80032efaf0 100644 --- a/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentScheduler.swift +++ b/SignalServiceKit/Backups/Attachments/OrphanedBackupAttachmentScheduler.swift @@ -53,7 +53,7 @@ public class OrphanedBackupAttachmentSchedulerImpl: OrphanedBackupAttachmentSche withMediaName mediaName: String, tx: DBWriteTransaction ) { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } try! OrphanedBackupAttachment diff --git a/SignalServiceKit/Backups/Settings/BackupIdService.swift b/SignalServiceKit/Backups/Settings/BackupIdService.swift index 308a604d1c..cda1c52529 100644 --- a/SignalServiceKit/Backups/Settings/BackupIdService.swift +++ b/SignalServiceKit/Backups/Settings/BackupIdService.swift @@ -66,7 +66,7 @@ final class BackupIdServiceImpl: BackupIdService { localAci: Aci, auth: ChatServiceAuth ) async throws { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } @@ -110,7 +110,7 @@ final class BackupIdServiceImpl: BackupIdService { key: MessageRootBackupKey, auth: ChatServiceAuth ) async throws { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } diff --git a/SignalServiceKit/Backups/Settings/BackupRefreshManager.swift b/SignalServiceKit/Backups/Settings/BackupRefreshManager.swift index 0b8d0a984f..2ea68a0702 100644 --- a/SignalServiceKit/Backups/Settings/BackupRefreshManager.swift +++ b/SignalServiceKit/Backups/Settings/BackupRefreshManager.swift @@ -63,7 +63,7 @@ public final class BackupRefreshManager { localIdentifiers: LocalIdentifiers, auth: ChatServiceAuth ) async throws { - guard FeatureFlags.Backups.supported else { + guard BuildFlags.Backups.supported else { return } diff --git a/SignalServiceKit/Contacts/ContactOutputStream.swift b/SignalServiceKit/Contacts/ContactOutputStream.swift index ef0a62422d..8fba67d375 100644 --- a/SignalServiceKit/Contacts/ContactOutputStream.swift +++ b/SignalServiceKit/Contacts/ContactOutputStream.swift @@ -27,7 +27,7 @@ final class ContactOutputStream { } if let aci { contactBuilder.setAci(aci.serviceIdString) - if FeatureFlags.serviceIdBinaryVariableOverhead { + if BuildFlags.serviceIdBinaryVariableOverhead { contactBuilder.setAciBinary(aci.serviceIdBinary) } } diff --git a/SignalServiceKit/Debugging/OWSFail.swift b/SignalServiceKit/Debugging/OWSFail.swift index 281985268e..650de6d1a5 100644 --- a/SignalServiceKit/Debugging/OWSFail.swift +++ b/SignalServiceKit/Debugging/OWSFail.swift @@ -13,7 +13,7 @@ public func owsFailBeta( function: String = #function, line: Int = #line ) { - if FeatureFlags.isPrerelease { + if BuildFlags.isPrerelease { owsFail(logMessage, file: file, function: function, line: line) } else { owsFailDebug(logMessage, file: file, function: function, line: line) diff --git a/SignalServiceKit/Devices/LinkingProvisioningMessage.swift b/SignalServiceKit/Devices/LinkingProvisioningMessage.swift index b4f570e249..b8989fd4d9 100644 --- a/SignalServiceKit/Devices/LinkingProvisioningMessage.swift +++ b/SignalServiceKit/Devices/LinkingProvisioningMessage.swift @@ -154,11 +154,11 @@ public struct LinkingProvisioningMessage { messageBuilder.setProvisioningVersion(Constants.provisioningVersion) messageBuilder.setNumber(phoneNumber) messageBuilder.setAci(aci.rawUUID.uuidString.lowercased()) - if FeatureFlags.serviceIdBinaryProvisioning { + if BuildFlags.serviceIdBinaryProvisioning { messageBuilder.setAciBinary(aci.rawUUID.data) } messageBuilder.setPni(pni.rawUUID.uuidString.lowercased()) - if FeatureFlags.serviceIdBinaryProvisioning { + if BuildFlags.serviceIdBinaryProvisioning { messageBuilder.setPniBinary(pni.rawUUID.data) } diff --git a/SignalServiceKit/Devices/SyncMessages/OWSBlockedPhoneNumbersMessage.m b/SignalServiceKit/Devices/SyncMessages/OWSBlockedPhoneNumbersMessage.m index 14173c9efe..5b3ebbe2a4 100644 --- a/SignalServiceKit/Devices/SyncMessages/OWSBlockedPhoneNumbersMessage.m +++ b/SignalServiceKit/Devices/SyncMessages/OWSBlockedPhoneNumbersMessage.m @@ -54,7 +54,7 @@ NS_ASSUME_NONNULL_BEGIN [aciBinaries addObject:aciObj.serviceIdBinary]; } } - if (FeatureFlagsObjC.serviceIdBinaryVariableOverhead) { + if (BuildFlagsObjC.serviceIdBinaryVariableOverhead) { [blockedBuilder setAcisBinary:aciBinaries]; } [blockedBuilder setGroupIds:_groupIds]; diff --git a/SignalServiceKit/Devices/SyncMessages/OWSReadReceiptsForLinkedDevicesMessage.m b/SignalServiceKit/Devices/SyncMessages/OWSReadReceiptsForLinkedDevicesMessage.m index 1dbd30162c..f0b53667e1 100644 --- a/SignalServiceKit/Devices/SyncMessages/OWSReadReceiptsForLinkedDevicesMessage.m +++ b/SignalServiceKit/Devices/SyncMessages/OWSReadReceiptsForLinkedDevicesMessage.m @@ -46,7 +46,7 @@ NS_ASSUME_NONNULL_BEGIN ServiceIdObjC *aciObj = readReceipt.senderAddress.serviceIdObjC; if ([aciObj isKindOfClass:[AciObjC class]]) { [readProtoBuilder setSenderAci:aciObj.serviceIdString]; - if (FeatureFlagsObjC.serviceIdBinaryVariableOverhead) { + if (BuildFlagsObjC.serviceIdBinaryVariableOverhead) { [readProtoBuilder setSenderAciBinary:aciObj.serviceIdBinary]; } } else { diff --git a/SignalServiceKit/Devices/SyncMessages/OWSViewOnceMessageReadSyncMessage.m b/SignalServiceKit/Devices/SyncMessages/OWSViewOnceMessageReadSyncMessage.m index ac8855481d..db921df069 100644 --- a/SignalServiceKit/Devices/SyncMessages/OWSViewOnceMessageReadSyncMessage.m +++ b/SignalServiceKit/Devices/SyncMessages/OWSViewOnceMessageReadSyncMessage.m @@ -65,7 +65,7 @@ NS_ASSUME_NONNULL_BEGIN ServiceIdObjC *senderAci = self.senderAddress.serviceIdObjC; if ([senderAci isKindOfClass:[AciObjC class]]) { readProtoBuilder.senderAci = senderAci.serviceIdString; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { readProtoBuilder.senderAciBinary = senderAci.serviceIdBinary; } } else { diff --git a/SignalServiceKit/Devices/SyncMessages/OWSViewedReceiptsForLinkedDevicesMessage.m b/SignalServiceKit/Devices/SyncMessages/OWSViewedReceiptsForLinkedDevicesMessage.m index 308339a2fc..4b1da4e786 100644 --- a/SignalServiceKit/Devices/SyncMessages/OWSViewedReceiptsForLinkedDevicesMessage.m +++ b/SignalServiceKit/Devices/SyncMessages/OWSViewedReceiptsForLinkedDevicesMessage.m @@ -51,7 +51,7 @@ NS_ASSUME_NONNULL_BEGIN ServiceIdObjC *aciObj = viewedReceipt.senderAddress.serviceIdObjC; if ([aciObj isKindOfClass:[AciObjC class]]) { [viewedProtoBuilder setSenderAci:aciObj.serviceIdString]; - if (FeatureFlagsObjC.serviceIdBinaryVariableOverhead) { + if (BuildFlagsObjC.serviceIdBinaryVariableOverhead) { [viewedProtoBuilder setSenderAciBinary:aciObj.serviceIdBinary]; } } else { diff --git a/SignalServiceKit/Environment/AppSetup.swift b/SignalServiceKit/Environment/AppSetup.swift index 7651376a26..110daff405 100644 --- a/SignalServiceKit/Environment/AppSetup.swift +++ b/SignalServiceKit/Environment/AppSetup.swift @@ -223,7 +223,7 @@ extension AppSetup.GlobalsContinuation { let libsignalNet = Net( env: TSConstants.isUsingProductionService ? .production : .staging, userAgent: HttpHeaders.userAgentHeaderValueSignalIos, - buildVariant: FeatureFlags.netBuildVariant, + buildVariant: BuildFlags.netBuildVariant, remoteConfig: remoteConfig.netConfig(), ) @@ -2023,7 +2023,7 @@ extension AppSetup.FinalContinuation { dependenciesBridge.tsAccountManager.warmCaches(tx: tx) return sskEnvironment.remoteConfigManagerRef.warmCaches(tx: tx) } - libsignalNet.setRemoteConfig(remoteConfig.netConfig(), buildVariant: FeatureFlags.netBuildVariant) + libsignalNet.setRemoteConfig(remoteConfig.netConfig(), buildVariant: BuildFlags.netBuildVariant) } // Warm (or re-warm) all of the caches. In theory, every cache is diff --git a/SignalServiceKit/Environment/FeatureFlags+Generated.swift b/SignalServiceKit/Environment/BuildFlags+Generated.swift similarity index 100% rename from SignalServiceKit/Environment/FeatureFlags+Generated.swift rename to SignalServiceKit/Environment/BuildFlags+Generated.swift diff --git a/SignalServiceKit/Environment/FeatureFlags.swift b/SignalServiceKit/Environment/BuildFlags.swift similarity index 90% rename from SignalServiceKit/Environment/FeatureFlags.swift rename to SignalServiceKit/Environment/BuildFlags.swift index 17f1bd5a5a..acf37b9bff 100644 --- a/SignalServiceKit/Environment/FeatureFlags.swift +++ b/SignalServiceKit/Environment/BuildFlags.swift @@ -23,7 +23,7 @@ private let build = FeatureBuild.current /// By centralizing feature flags here and documenting their rollout plan, /// it's easier to review which feature flags are in play. -public enum FeatureFlags { +public enum BuildFlags { public static let choochoo = build <= .internal @@ -95,17 +95,17 @@ public enum FeatureFlags { // MARK: - @objc -public class FeatureFlagsObjC: NSObject { +public class BuildFlagsObjC: NSObject { @objc - public static let serviceIdBinaryConstantOverhead = FeatureFlags.serviceIdBinaryConstantOverhead + public static let serviceIdBinaryConstantOverhead = BuildFlags.serviceIdBinaryConstantOverhead @objc - public static let serviceIdBinaryVariableOverhead = FeatureFlags.serviceIdBinaryVariableOverhead + public static let serviceIdBinaryVariableOverhead = BuildFlags.serviceIdBinaryVariableOverhead } // MARK: - -extension FeatureFlags { +extension BuildFlags { public static var buildVariantString: String? { // Leaving this internal only for now. If we ever move this to // HelpSettings we need to localize these strings @@ -114,17 +114,17 @@ extension FeatureFlags { return nil } - let featureFlagString: String? + let buildFlagString: String? switch build { case .dev: - featureFlagString = LocalizationNotNeeded("Dev") + buildFlagString = LocalizationNotNeeded("Dev") case .internal: - featureFlagString = LocalizationNotNeeded("Internal") + buildFlagString = LocalizationNotNeeded("Internal") case .beta: - featureFlagString = LocalizationNotNeeded("Beta") + buildFlagString = LocalizationNotNeeded("Beta") case .production: // Production can be inferred from the lack of flag - featureFlagString = nil + buildFlagString = nil } let configuration: String? = { @@ -133,13 +133,12 @@ extension FeatureFlags { #elseif TESTABLE_BUILD LocalizationNotNeeded("Testable") #else - // RELEASE can be inferred from the lack of configuration. This will only be hit if the outer #if is removed. + // RELEASE can be inferred from the lack of configuration. nil #endif }() - // If we're Production+Release, this will return nil and won't show up in Help Settings - return [featureFlagString, configuration] + return [buildFlagString, configuration] .compactMap { $0 } .joined(separator: " — ") .nilIfEmpty @@ -149,7 +148,7 @@ extension FeatureFlags { // MARK: - /// Flags that we'll leave in the code base indefinitely that are helpful for -/// development should go here, rather than cluttering up FeatureFlags. +/// development should go here, rather than cluttering up BuildFlags. public enum DebugFlags { public static let internalLogging = build <= .internal diff --git a/SignalServiceKit/Environment/RemoteConfigManager.swift b/SignalServiceKit/Environment/RemoteConfigManager.swift index d672926b97..3b8d85a158 100644 --- a/SignalServiceKit/Environment/RemoteConfigManager.swift +++ b/SignalServiceKit/Environment/RemoteConfigManager.swift @@ -235,7 +235,7 @@ public class RemoteConfig { public var backupListMediaDefaultRefreshIntervalMs: UInt64 { let defaultValue: UInt64 - if FeatureFlags.useLowerDefaultListMediaRefreshInterval { + if BuildFlags.useLowerDefaultListMediaRefreshInterval { defaultValue = .dayInMs } else { defaultValue = .dayInMs * 30 @@ -286,11 +286,11 @@ public class RemoteConfig { } public var allowBackupSettings: Bool { - if FeatureFlags.Backups.alwaysShowSettings { + if BuildFlags.Backups.alwaysShowSettings { return true } - return FeatureFlags.Backups.supported && isEnabled(.allowBackupSettings) + return BuildFlags.Backups.supported && isEnabled(.allowBackupSettings) } public var ringrtcNwPathMonitorTrial: Bool { @@ -908,7 +908,7 @@ public class RemoteConfigManagerImpl: RemoteConfigManager { await checkClientExpiration(valueFlag: mergedConfig.value(.clientExpiration)) - net.setRemoteConfig(mergedConfig.netConfig(), buildVariant: FeatureFlags.netBuildVariant) + net.setRemoteConfig(mergedConfig.netConfig(), buildVariant: BuildFlags.netBuildVariant) mergedConfig.logFlags() } diff --git a/SignalServiceKit/Megaphones/ExperienceUpgradeManifest.swift b/SignalServiceKit/Megaphones/ExperienceUpgradeManifest.swift index 07568a9737..5b9f9ce2d3 100644 --- a/SignalServiceKit/Megaphones/ExperienceUpgradeManifest.swift +++ b/SignalServiceKit/Megaphones/ExperienceUpgradeManifest.swift @@ -716,7 +716,7 @@ extension ExperienceUpgradeManifest { transaction: DBReadTransaction ) -> Bool { guard - FeatureFlags.Backups.showMegaphones, + BuildFlags.Backups.showMegaphones, tsAccountManager.registrationState(tx: transaction).isRegisteredPrimaryDevice else { return false @@ -752,7 +752,7 @@ extension ExperienceUpgradeManifest { transaction: DBReadTransaction, ) -> Bool { guard - FeatureFlags.Backups.showMegaphones, + BuildFlags.Backups.showMegaphones, tsAccountManager.registrationState(tx: transaction).isRegisteredPrimaryDevice else { return false diff --git a/SignalServiceKit/Messages/Attachments/V2/Downloads/AttachmentDownloadManagerImpl.swift b/SignalServiceKit/Messages/Attachments/V2/Downloads/AttachmentDownloadManagerImpl.swift index 6b8a53dabf..0ba3749541 100644 --- a/SignalServiceKit/Messages/Attachments/V2/Downloads/AttachmentDownloadManagerImpl.swift +++ b/SignalServiceKit/Messages/Attachments/V2/Downloads/AttachmentDownloadManagerImpl.swift @@ -262,7 +262,7 @@ public class AttachmentDownloadManagerImpl: AttachmentDownloadManager { ) { let backupPlan = backupSettingsStore.backupPlan(tx: tx) let isEligibleToDownloadFromMediaTier: Bool - if FeatureFlags.Backups.supported { + if BuildFlags.Backups.supported { switch backupPlan { case .disabled, .disabling: isEligibleToDownloadFromMediaTier = false diff --git a/SignalServiceKit/Messages/BodyRanges/MessageBodyRanges.swift b/SignalServiceKit/Messages/BodyRanges/MessageBodyRanges.swift index 482891776d..ec9198985c 100644 --- a/SignalServiceKit/Messages/BodyRanges/MessageBodyRanges.swift +++ b/SignalServiceKit/Messages/BodyRanges/MessageBodyRanges.swift @@ -422,7 +422,7 @@ public class MessageBodyRanges: NSObject, NSCopying, NSSecureCoding { guard let builder = self.protoBuilder(mention.range, maxBodyLength: maxBodyLength) else { return } - if FeatureFlags.serviceIdBinaryOneOf { + if BuildFlags.serviceIdBinaryOneOf { builder.setMentionAciBinary(mention.value.serviceIdBinary) } else { builder.setMentionAci(mention.value.serviceIdString) diff --git a/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift b/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift index a477c97797..125dd4b52d 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/DeleteForMe/DeleteForMeOutgoingSyncMessage.swift @@ -128,7 +128,7 @@ extension DeleteForMeSyncMessage.Outgoing { let protoBuilder = SSKProtoSyncMessageDeleteForMeConversationIdentifier.builder() switch self { case .threadServiceId(let serviceId): - if FeatureFlags.serviceIdBinaryOneOf { + if BuildFlags.serviceIdBinaryOneOf { protoBuilder.setThreadServiceIDBinary(serviceId.wrappedValue.serviceIdBinary) } else { protoBuilder.setThreadServiceID(serviceId.wrappedValue.serviceIdString) @@ -202,7 +202,7 @@ extension DeleteForMeSyncMessage.Outgoing { protoBuilder.setSentTimestamp(sentTimestamp) switch author { case .aci(let aci): - if FeatureFlags.serviceIdBinaryOneOf { + if BuildFlags.serviceIdBinaryOneOf { protoBuilder.setAuthorServiceIDBinary(aci.wrappedValue.serviceIdBinary) } else { protoBuilder.setAuthorServiceID(aci.wrappedValue.serviceIdString) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m index 450979d030..a691d6767b 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m +++ b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.m @@ -93,7 +93,7 @@ NS_ASSUME_NONNULL_BEGIN [sentBuilder setTimestamp:self.timestamp]; [sentBuilder setDestinationE164:self.sentRecipientAddress.phoneNumber]; [sentBuilder setDestinationServiceID:self.sentRecipientAddress.serviceIdString]; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { [sentBuilder setDestinationServiceIDBinary:self.sentRecipientAddress.serviceIdObjC.serviceIdBinary]; } [sentBuilder setIsRecipientUpdate:self.isRecipientUpdate]; diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.swift b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.swift index f8971e779b..bdb088c261 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.swift +++ b/SignalServiceKit/Messages/DeviceSyncing/OWSOutgoingSentMessageTranscript.swift @@ -81,7 +81,7 @@ extension OWSOutgoingSentMessageTranscript { let statusBuilder = SSKProtoSyncMessageSentUnidentifiedDeliveryStatus.builder() statusBuilder.setDestinationServiceID(recipientServiceId.serviceIdString) - if FeatureFlags.serviceIdBinaryVariableOverhead { + if BuildFlags.serviceIdBinaryVariableOverhead { statusBuilder.setDestinationServiceIDBinary(recipientServiceId.serviceIdBinary) } statusBuilder.setUnidentified(recipientState.wasSentByUD) diff --git a/SignalServiceKit/Messages/DeviceSyncing/OWSSyncMessageRequestResponseMessage.m b/SignalServiceKit/Messages/DeviceSyncing/OWSSyncMessageRequestResponseMessage.m index e9a54608cb..d2036407e5 100644 --- a/SignalServiceKit/Messages/DeviceSyncing/OWSSyncMessageRequestResponseMessage.m +++ b/SignalServiceKit/Messages/DeviceSyncing/OWSSyncMessageRequestResponseMessage.m @@ -81,7 +81,7 @@ NS_ASSUME_NONNULL_BEGIN messageRequestResponseBuilder.groupID = self.groupId; } else if (self.threadAci != nil) { messageRequestResponseBuilder.threadAci = self.threadAci; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { messageRequestResponseBuilder.threadAciBinary = [[AciObjC alloc] initWithAciString:self.threadAci].serviceIdBinary; } @@ -105,7 +105,7 @@ NS_ASSUME_NONNULL_BEGIN ServiceIdObjC *threadAci = contactThread.contactAddress.serviceIdObjC; if ([threadAci isKindOfClass:[AciObjC class]]) { messageRequestResponseBuilder.threadAci = threadAci.serviceIdString; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { messageRequestResponseBuilder.threadAciBinary = threadAci.serviceIdBinary; } } diff --git a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift index b4a0e7c93d..6aaf6d70ce 100644 --- a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift +++ b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollTerminate.swift @@ -56,7 +56,7 @@ class OutgoingPollTerminateMessage: TSOutgoingMessage { pollTerminateBuilder.buildInfallibly() ) - if !FeatureFlags.pollKeepProtoVersion { + if !BuildFlags.pollKeepProtoVersion { dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue)) } diff --git a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift index 4f05ba8b5c..b04f3647cc 100644 --- a/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift +++ b/SignalServiceKit/Messages/Interactions/Polls/OutgoingPollVote.swift @@ -82,7 +82,7 @@ public class OutgoingPollVoteMessage: TSOutgoingMessage { pollVoteBuilder.buildInfallibly() ) - if !FeatureFlags.pollKeepProtoVersion { + if !BuildFlags.pollKeepProtoVersion { dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue)) } diff --git a/SignalServiceKit/Messages/Interactions/Quotes/QuotedReplyManagerImpl.swift b/SignalServiceKit/Messages/Interactions/Quotes/QuotedReplyManagerImpl.swift index a97b6ce755..483b359427 100644 --- a/SignalServiceKit/Messages/Interactions/Quotes/QuotedReplyManagerImpl.swift +++ b/SignalServiceKit/Messages/Interactions/Quotes/QuotedReplyManagerImpl.swift @@ -816,7 +816,7 @@ public class QuotedReplyManagerImpl: QuotedReplyManager { throw OWSAssertionError("It should be impossible to quote a message without a UUID") } quoteBuilder.setAuthorAci(authorAci.serviceIdString) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { quoteBuilder.setAuthorAciBinary(authorAci.serviceIdBinary) } diff --git a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m index 65ae16de13..9e8c6ae5f3 100644 --- a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m +++ b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.m @@ -475,7 +475,7 @@ NSUInteger const TSOutgoingMessageSchemaVersion = 1; [SSKProtoDataMessageReaction builderWithEmoji:self.storyReactionEmoji timestamp:self.storyTimestamp.unsignedLongLongValue]; [reactionBuilder setTargetAuthorAci:self.storyAuthorAci.serviceIdString]; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { [reactionBuilder setTargetAuthorAciBinary:self.storyAuthorAci.serviceIdBinary]; } @@ -494,7 +494,7 @@ NSUInteger const TSOutgoingMessageSchemaVersion = 1; SSKProtoDataMessageStoryContextBuilder *storyContextBuilder = [SSKProtoDataMessageStoryContext builder]; [storyContextBuilder setAuthorAci:self.storyAuthorAci.serviceIdString]; - if (FeatureFlagsObjC.serviceIdBinaryConstantOverhead) { + if (BuildFlagsObjC.serviceIdBinaryConstantOverhead) { [storyContextBuilder setAuthorAciBinary:self.storyAuthorAci.serviceIdBinary]; } [storyContextBuilder setSentTimestamp:self.storyTimestamp.unsignedLongLongValue]; diff --git a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift index 3fe6f034f6..2db7845f5a 100644 --- a/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift +++ b/SignalServiceKit/Messages/Interactions/TSOutgoingMessage.swift @@ -623,7 +623,7 @@ extension TSOutgoingMessage { @objc func shouldBumpProtoForPolls() -> Bool { - return !FeatureFlags.pollKeepProtoVersion + return !BuildFlags.pollKeepProtoVersion } } diff --git a/SignalServiceKit/Messages/MessageReceiver.swift b/SignalServiceKit/Messages/MessageReceiver.swift index e70cea53b8..4b40cc19fb 100644 --- a/SignalServiceKit/Messages/MessageReceiver.swift +++ b/SignalServiceKit/Messages/MessageReceiver.swift @@ -398,7 +398,7 @@ public final class MessageReceiver { } if dataMessage.pollCreate != nil || dataMessage.pollTerminate != nil || dataMessage.pollVote != nil { - guard FeatureFlags.pollReceive else { + guard BuildFlags.pollReceive else { Logger.warn("Polls not supported on this device") return } @@ -1205,7 +1205,7 @@ public final class MessageReceiver { } if dataMessage.pollCreate != nil || dataMessage.pollTerminate != nil || dataMessage.pollVote != nil { - guard FeatureFlags.pollReceive else { + guard BuildFlags.pollReceive else { Logger.warn("Polls not supported on this device") return nil } diff --git a/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift b/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift index a56a5eaa60..15ac3d3e75 100644 --- a/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift +++ b/SignalServiceKit/Messages/Reactions/OutgoingReactionMessage.swift @@ -31,7 +31,7 @@ extension OWSOutgoingReactionMessage { return nil } reactionBuilder.setTargetAuthorAci(messageAuthor.serviceIdString) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { reactionBuilder.setTargetAuthorAciBinary(messageAuthor.serviceIdBinary) } diff --git a/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift b/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift index 5b2eb369d5..4ea1369dbb 100644 --- a/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift +++ b/SignalServiceKit/Messages/Stories/OutgoingStorySentMessageTranscript.swift @@ -96,7 +96,7 @@ public class OutgoingStorySentMessageTranscript: OWSOutgoingSyncMessage { for (serviceId, state) in recipientStates { let builder = SSKProtoSyncMessageSentStoryMessageRecipient.builder() builder.setDestinationServiceID(serviceId.serviceIdString) - if FeatureFlags.serviceIdBinaryVariableOverhead { + if BuildFlags.serviceIdBinaryVariableOverhead { builder.setDestinationServiceIDBinary(serviceId.serviceIdBinary) } builder.setDistributionListIds(state.contexts.map { $0.uuidString }) diff --git a/SignalServiceKit/Security/OWSRecipientIdentity.swift b/SignalServiceKit/Security/OWSRecipientIdentity.swift index 196c26bd23..83ffa710bc 100644 --- a/SignalServiceKit/Security/OWSRecipientIdentity.swift +++ b/SignalServiceKit/Security/OWSRecipientIdentity.swift @@ -255,7 +255,7 @@ public final class OWSRecipientIdentity: NSObject, SDSCodableModel, Decodable { let verifiedBuilder = SSKProtoVerified.builder() verifiedBuilder.setDestinationAci(destinationAci.wrappedAciValue.serviceIdString) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { verifiedBuilder.setDestinationAciBinary(destinationAci.wrappedAciValue.serviceIdBinary) } verifiedBuilder.setIdentityKey(identityKey) diff --git a/SignalServiceKit/Storage/Database/GRDBSchemaMigrator.swift b/SignalServiceKit/Storage/Database/GRDBSchemaMigrator.swift index 221d0db745..126af6e9d0 100644 --- a/SignalServiceKit/Storage/Database/GRDBSchemaMigrator.swift +++ b/SignalServiceKit/Storage/Database/GRDBSchemaMigrator.swift @@ -4219,7 +4219,7 @@ public class GRDBSchemaMigrator { migrator.registerMigration(.addPreKey) { tx in try createPreKey(tx: tx) - if FeatureFlags.decodeDeprecatedPreKeys { + if BuildFlags.decodeDeprecatedPreKeys { try migratePreKeys(tx: tx) } try dropOldPreKeys(tx: tx) diff --git a/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/IncrementalMessageTSAttachmentMigrator.swift b/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/IncrementalMessageTSAttachmentMigrator.swift index de88c616bf..6d6908985e 100644 --- a/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/IncrementalMessageTSAttachmentMigrator.swift +++ b/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/IncrementalMessageTSAttachmentMigrator.swift @@ -135,7 +135,7 @@ public class IncrementalMessageTSAttachmentMigratorImpl: IncrementalMessageTSAtt private func runInMainAppBackground() async { guard - FeatureFlags.runTSAttachmentMigrationInMainAppBackground, + BuildFlags.runTSAttachmentMigrationInMainAppBackground, appContext.isMainAppAndActive, isRunningInMainApp.tryToSetFlag() else { diff --git a/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/TSAttachmentMigration+TSMessage.swift b/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/TSAttachmentMigration+TSMessage.swift index 7fb1cca953..e1cdd33bc4 100644 --- a/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/TSAttachmentMigration+TSMessage.swift +++ b/SignalServiceKit/Storage/Database/IncrementalMigrations/TSAttachment/TSAttachmentMigration+TSMessage.swift @@ -47,7 +47,7 @@ extension TSAttachmentMigration { /// Phases 1/2 must be a separate transaction from phase 3, which must be different from phase 4. /// /// Phase 1: "prepare" TSMessages for migration, starting with the newest first. - /// This will be enabled at the same time that we enable the FeatureFlag to use v2 attachments for + /// This will be enabled at the same time that we enable the BuildFlag to use v2 attachments for /// _new_ messages, so the start point marks the cutoff between legacy and v2 attachments. /// We work backwards, newest first, to migrate the legacy attachments. /// We "prepare" a TSMessage by inserting a row into the TSAttachmentMigration table. diff --git a/SignalServiceKit/Storage/Database/Records/InteractionFinder.swift b/SignalServiceKit/Storage/Database/Records/InteractionFinder.swift index ee8678f1e6..dab2155e32 100644 --- a/SignalServiceKit/Storage/Database/Records/InteractionFinder.swift +++ b/SignalServiceKit/Storage/Database/Records/InteractionFinder.swift @@ -1201,7 +1201,7 @@ public class InteractionFinder: NSObject { ) let indexedBy: String - if FeatureFlags.useNewConversationLoadIndex { + if BuildFlags.useNewConversationLoadIndex { indexedBy = "INDEXED BY index_interactions_on_threadUniqueId_and_id" } else { indexedBy = DEBUG_INDEXED_BY("index_interactions_on_threadUniqueId_and_id", or: "index_model_TSInteraction_ConversationLoadInteractionDistance") @@ -1356,7 +1356,7 @@ public class InteractionFinder: NSObject { let indexedBy: String switch additionalFiltering { - case .filterForConversationView where FeatureFlags.useNewConversationLoadIndex: + case .filterForConversationView where BuildFlags.useNewConversationLoadIndex: indexedBy = "INDEXED BY index_interactions_on_threadUniqueId_and_id" case .filterForConversationView: indexedBy = DEBUG_INDEXED_BY("index_interactions_on_threadUniqueId_and_id", or: "index_model_TSInteraction_ConversationLoadInteractionDistance") diff --git a/SignalServiceKit/StorageService/StorageServiceProto+Sync.swift b/SignalServiceKit/StorageService/StorageServiceProto+Sync.swift index 856a1f7a3b..bad5055254 100644 --- a/SignalServiceKit/StorageService/StorageServiceProto+Sync.swift +++ b/SignalServiceKit/StorageService/StorageServiceProto+Sync.swift @@ -270,7 +270,7 @@ class StorageServiceContactRecordUpdater: StorageServiceRecordUpdater { if let aci = contact.aci { builder.setAci(aci.serviceIdString) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { builder.setAciBinary(aci.serviceIdBinary) } } @@ -280,7 +280,7 @@ class StorageServiceContactRecordUpdater: StorageServiceRecordUpdater { } if let pni = contact.pni { builder.setPni(pni.rawUUID.uuidString.lowercased()) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { builder.setPniBinary(pni.rawUUID.data) } } @@ -1927,7 +1927,7 @@ extension StorageServiceAccountRecordUpdater { var contactBuilder = StorageServiceProtoAccountRecordPinnedConversationContact.builder() if let serviceId = contactThread.contactAddress.serviceId { contactBuilder.setServiceID(serviceId.serviceIdString) - if FeatureFlags.serviceIdBinaryConstantOverhead { + if BuildFlags.serviceIdBinaryConstantOverhead { contactBuilder.setServiceIDBinary(serviceId.serviceIdBinary) } } else if let e164 = contactThread.contactAddress.phoneNumber { @@ -2006,7 +2006,7 @@ class StorageServiceStoryDistributionListRecordUpdater: StorageServiceRecordUpda let recipients = (try? storyRecipientManager.fetchRecipients(forStoryThread: story, tx: transaction)) ?? [] let serviceIds = recipients.compactMap { ($0.aci ?? $0.pni) } builder.setRecipientServiceIds(serviceIds.map(\.serviceIdString)) - if FeatureFlags.serviceIdBinaryVariableOverhead { + if BuildFlags.serviceIdBinaryVariableOverhead { builder.setRecipientServiceIdsBinary(serviceIds.map(\.serviceIdBinary)) } builder.setAllowsReplies(story.allowsReplies) diff --git a/SignalServiceKit/Subscriptions/Backups/BackupSubscriptionManager.swift b/SignalServiceKit/Subscriptions/Backups/BackupSubscriptionManager.swift index 8cbeeed449..96b9369a13 100644 --- a/SignalServiceKit/Subscriptions/Backups/BackupSubscriptionManager.swift +++ b/SignalServiceKit/Subscriptions/Backups/BackupSubscriptionManager.swift @@ -443,13 +443,13 @@ final class BackupSubscriptionManagerImpl: BackupSubscriptionManager { // MARK: - Purchase new subscription func subscriptionDisplayPrice() async throws -> String { - owsPrecondition(!FeatureFlags.Backups.avoidStoreKitForTesters) + owsPrecondition(!BuildFlags.Backups.avoidStoreKitForTesters) return try await getPaidTierProduct().displayPrice } func purchaseNewSubscription() async throws -> PurchaseResult { - owsPrecondition(!FeatureFlags.Backups.avoidStoreKitForTesters) + owsPrecondition(!BuildFlags.Backups.avoidStoreKitForTesters) switch try await getPaidTierProduct().purchase() { case .success(let purchaseResult): diff --git a/SignalServiceKit/Subscriptions/Backups/BackupTestFlightEntitlementManager.swift b/SignalServiceKit/Subscriptions/Backups/BackupTestFlightEntitlementManager.swift index 9b5bc9bf9f..1494ee2aff 100644 --- a/SignalServiceKit/Subscriptions/Backups/BackupTestFlightEntitlementManager.swift +++ b/SignalServiceKit/Subscriptions/Backups/BackupTestFlightEntitlementManager.swift @@ -69,7 +69,7 @@ final class BackupTestFlightEntitlementManagerImpl: BackupTestFlightEntitlementM } private func _acquireEntitlement() async throws { - owsPrecondition(FeatureFlags.Backups.avoidStoreKitForTesters) + owsPrecondition(BuildFlags.Backups.avoidStoreKitForTesters) guard TSConstants.isUsingProductionService else { // If we're on Staging, no need to do anything – all accounts on @@ -78,7 +78,7 @@ final class BackupTestFlightEntitlementManagerImpl: BackupTestFlightEntitlementM return } - guard !FeatureFlags.Backups.avoidAppAttestForDevs else { + guard !BuildFlags.Backups.avoidAppAttestForDevs else { // If we're on a dev build, we can't use AppAttest. If you're a dev // who needs the entitlement (i.e., paid-tier Backup auth // credentials), make sure you've gotten it for your account via @@ -112,7 +112,7 @@ final class BackupTestFlightEntitlementManagerImpl: BackupTestFlightEntitlementM ) = db.read { tx in ( tsAccountManager.registrationState(tx: tx).isRegisteredPrimaryDevice, - FeatureFlags.Backups.avoidStoreKitForTesters, + BuildFlags.Backups.avoidStoreKitForTesters, backupPlanManager.backupPlan(tx: tx), kvStore.getDate(StoreKeys.lastEntitlementRenewalDate, transaction: tx) ) @@ -205,7 +205,7 @@ final class BackupTestFlightEntitlementManagerImpl: BackupTestFlightEntitlementM /// /// However, to prevent abuse we need to restrict these requests to first-party /// TestFlight builds. We do this by gating the request with `AppAttest`, and -/// then limit the requests to TestFlight-flavored builds using a `FeatureFlag`. +/// then limit the requests to TestFlight-flavored builds using a BuildFlag. private struct AppAttestManager { /// Actions that require `DeviceCheck` attestation. diff --git a/SignalServiceKit/Util/Preferences.swift b/SignalServiceKit/Util/Preferences.swift index e796412682..5206393d3e 100644 --- a/SignalServiceKit/Util/Preferences.swift +++ b/SignalServiceKit/Util/Preferences.swift @@ -137,7 +137,7 @@ public class Preferences { // MARK: Logging public static var isFailDebugEnabled: Bool { - return FeatureFlags.failDebug && CurrentAppContext().appUserDefaults().bool(forKey: UserDefaultsKeys.isFailDebugEnabled) + return BuildFlags.failDebug && CurrentAppContext().appUserDefaults().bool(forKey: UserDefaultsKeys.isFailDebugEnabled) } public static func setIsFailDebugEnabled(_ value: Bool) { @@ -145,7 +145,7 @@ public class Preferences { } public static var isAudibleErrorLoggingEnabled: Bool { - CurrentAppContext().appUserDefaults().bool(forKey: UserDefaultsKeys.isAudibleErrorLoggingEnabled) && FeatureFlags.choochoo + CurrentAppContext().appUserDefaults().bool(forKey: UserDefaultsKeys.isAudibleErrorLoggingEnabled) && BuildFlags.choochoo } public static func setIsAudibleErrorLoggingEnabled(_ value: Bool) { diff --git a/SignalUI/ActionSheets/ActionSheetController.swift b/SignalUI/ActionSheets/ActionSheetController.swift index b8fc6c1417..26799602f3 100644 --- a/SignalUI/ActionSheets/ActionSheetController.swift +++ b/SignalUI/ActionSheets/ActionSheetController.swift @@ -182,7 +182,7 @@ open class ActionSheetController: OWSViewController { let insetFromScreenEdge: CGFloat = if #available(iOS 26, *), - FeatureFlags.iOS26SDKIsAvailable, + BuildFlags.iOS26SDKIsAvailable, UIDevice.current.hasIPhoneXNotch || UIDevice.current.isIPad { 8 @@ -241,7 +241,7 @@ open class ActionSheetController: OWSViewController { // We can't mask the content view because the backdrop intentionally extends outside of the content // view's bounds. But its two subviews are pinned at same top edge. We can just apply corner // radii to each layer individually to get a similar effect. - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { // Background container sets corner radius itself } else { let cornerRadius: CGFloat = 24 @@ -259,7 +259,7 @@ open class ActionSheetController: OWSViewController { private func createBackgroundView() -> UIView { #if compiler(>=6.2) - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { let glassEffect = UIGlassEffect(style: .regular) glassEffect.tintColor = UIColor.Signal.background.withAlphaComponent(2/3) let background = UIVisualEffectView(effect: glassEffect) @@ -278,7 +278,7 @@ open class ActionSheetController: OWSViewController { pinWidthConstraints?.forEach { $0.isActive = false } widthLimitConstraint?.isActive = true #if compiler(>=6.2) - if #available(iOS 26.0, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26.0, *), BuildFlags.iOS26SDKIsAvailable { backgroundView?.cornerConfiguration = .corners(radius: .fixed(24)) } #endif @@ -286,7 +286,7 @@ open class ActionSheetController: OWSViewController { widthLimitConstraint?.isActive = false pinWidthConstraints?.forEach { $0.isActive = true } #if compiler(>=6.2) - if #available(iOS 26.0, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26.0, *), BuildFlags.iOS26SDKIsAvailable { backgroundView?.cornerConfiguration = .uniformCorners(radius: .containerConcentric()) } #endif diff --git a/SignalUI/UIKitExtensions/UIButton+SignalUI.swift b/SignalUI/UIKitExtensions/UIButton+SignalUI.swift index 9ac46e2564..5981604bd5 100644 --- a/SignalUI/UIKitExtensions/UIButton+SignalUI.swift +++ b/SignalUI/UIKitExtensions/UIButton+SignalUI.swift @@ -463,7 +463,7 @@ public extension UIBarButtonItem { animated: Bool = true, completion: (() -> Void)? = nil ) -> UIBarButtonItem { - let systemItem: SystemItem = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + let systemItem: SystemItem = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { .close } else { .done diff --git a/SignalUI/ViewControllers/InteractiveSheetViewController.swift b/SignalUI/ViewControllers/InteractiveSheetViewController.swift index d724a6bb77..91f8817e08 100644 --- a/SignalUI/ViewControllers/InteractiveSheetViewController.swift +++ b/SignalUI/ViewControllers/InteractiveSheetViewController.swift @@ -68,7 +68,7 @@ open class InteractiveSheetViewController: OWSViewController { /// but still be sure to set it for devices running iOS 18 and older. open var placeOnGlassIfAvailable: Bool { false } private var isOnGlass: Bool { - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { placeOnGlassIfAvailable } else { false diff --git a/SignalUI/ViewControllers/OWSNavigationController.swift b/SignalUI/ViewControllers/OWSNavigationController.swift index cb862fbbfe..fe14bac825 100644 --- a/SignalUI/ViewControllers/OWSNavigationController.swift +++ b/SignalUI/ViewControllers/OWSNavigationController.swift @@ -75,7 +75,7 @@ open class OWSNavigationController: UINavigationController { } public init() { - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { super.init(nibName: nil, bundle: nil) } else { super.init(navigationBarClass: OWSNavigationBar.self, toolbarClass: nil) diff --git a/SignalUI/ViewControllers/OWSTableViewController2.swift b/SignalUI/ViewControllers/OWSTableViewController2.swift index 2f016fbd34..1369df3092 100644 --- a/SignalUI/ViewControllers/OWSTableViewController2.swift +++ b/SignalUI/ViewControllers/OWSTableViewController2.swift @@ -549,7 +549,7 @@ extension OWSTableViewController2: UITableViewDataSource, UITableViewDelegate, O /// Approximate cell corner rounding. Now that we use native inset grouped /// tables, this is only an approximation and its use should be avoided. - public static let cellRounding: CGFloat = if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { + public static let cellRounding: CGFloat = if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { 22 } else { 10 @@ -1017,7 +1017,7 @@ extension OWSTableViewController2: UITableViewDataSource, UITableViewDelegate, O } public static func removeBackButtonText(viewController: UIViewController) { - if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable { return } + if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable { return } // We never want to show titles on back buttons, so we replace it with // blank spaces. We pad it out slightly so that it's more tappable. viewController.navigationItem.backBarButtonItem = .init(title: " ", style: .plain, target: nil, action: nil)