Rename FeatureFlags → BuildFlags

This commit is contained in:
Max Radermacher 2025-10-27 13:27:11 -05:00 committed by GitHub
parent 7d66b9713b
commit 560cefae94
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
88 changed files with 182 additions and 183 deletions

View File

@ -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):

View File

@ -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 = "<group>"; };
505C2ED82997422D00C23FB2 /* SelfSignedIdentityTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelfSignedIdentityTest.swift; sourceTree = "<group>"; };
505C2EDA29974D2000C23FB2 /* StorageServiceContactTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageServiceContactTest.swift; sourceTree = "<group>"; };
505F76322BC45C0700B1B51C /* FeatureFlags+Generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FeatureFlags+Generated.swift"; sourceTree = "<group>"; };
505F76322BC45C0700B1B51C /* BuildFlags+Generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BuildFlags+Generated.swift"; sourceTree = "<group>"; };
5060EBB92C7D211A00DF77AD /* OutgoingCallLinkUpdateMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingCallLinkUpdateMessage.swift; sourceTree = "<group>"; };
5063B41D2C5432A30041CA51 /* ResolvableValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResolvableValue.swift; sourceTree = "<group>"; };
506695E029C296D500B6D8D0 /* RecipientMergerTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientMergerTest.swift; sourceTree = "<group>"; };
@ -7661,7 +7661,7 @@
F9C5CB54289453B200548EEE /* UserProfileFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserProfileFinder.swift; sourceTree = "<group>"; };
F9C5CB57289453B200548EEE /* ModelReadCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ModelReadCache.swift; sourceTree = "<group>"; };
F9C5CB58289453B200548EEE /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = "<group>"; };
F9C5CB59289453B200548EEE /* FeatureFlags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeatureFlags.swift; sourceTree = "<group>"; };
F9C5CB59289453B200548EEE /* BuildFlags.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BuildFlags.swift; sourceTree = "<group>"; };
F9C5CB5B289453B200548EEE /* ExperienceUpgradeFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExperienceUpgradeFinder.swift; sourceTree = "<group>"; };
F9C5CB5D289453B200548EEE /* SwiftSingletons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSingletons.swift; sourceTree = "<group>"; };
F9C5CB61289453B200548EEE /* LocalDevice.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LocalDevice.swift; sourceTree = "<group>"; };
@ -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 */,

View File

@ -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 {

View File

@ -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()

View File

@ -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

View File

@ -79,7 +79,7 @@ class ChooseBackupPlanViewController: HostingController<ChooseBackupPlanView> {
from: fromViewController,
) { () throws(ActionSheetDisplayableError) in
let storeKitAvailability: StoreKitAvailability
if FeatureFlags.Backups.avoidStoreKitForTesters {
if BuildFlags.Backups.avoidStoreKitForTesters {
storeKitAvailability = .unavailableForTesters
} else {
do {

View File

@ -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

View File

@ -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 {

View File

@ -110,7 +110,7 @@ extension ConversationViewController: CVComponentDelegate {
itemViewModel: CVItemViewModelImpl,
shouldAllowReply: Bool
) {
guard FeatureFlags.pollSend else {
guard BuildFlags.pollSend else {
return
}

View File

@ -525,7 +525,7 @@ extension ConversationViewController: ConversationInputToolbarDelegate {
public func pollButtonPressed() {
AssertIsOnMainThread()
if !FeatureFlags.pollSend {
if !BuildFlags.pollSend {
return
}

View File

@ -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)

View File

@ -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

View File

@ -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 {

View File

@ -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),

View File

@ -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

View File

@ -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 {

View File

@ -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<NSLayoutXAxisAnchor> = 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",

View File

@ -67,7 +67,7 @@ class BackupBGProcessingTaskRunner: BGProcessingTaskRunner {
}
public func startCondition() -> BGProcessingTaskStartCondition {
guard FeatureFlags.Backups.supported else {
guard BuildFlags.Backups.supported else {
return .never
}

View File

@ -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

View File

@ -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)

View File

@ -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] {

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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 {

View File

@ -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,

View File

@ -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(

View File

@ -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.

View File

@ -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()
}

View File

@ -415,7 +415,7 @@ public class OWSTabBar: UITabBar {
return
}
if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable {
if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable {
return
}

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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,

View File

@ -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() {}

View File

@ -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

View File

@ -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.

View File

@ -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(

View File

@ -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)"
}

View File

@ -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()
}
}

View File

@ -133,7 +133,7 @@ public class AttachmentOffloadingManagerImpl: AttachmentOffloadingManager {
}
public func offloadAttachmentsIfNeeded() async throws {
guard FeatureFlags.Backups.supported else {
guard BuildFlags.Backups.supported else {
return
}

View File

@ -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 {

View File

@ -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<TaskRunner>) async -> TaskRecordResult {
guard FeatureFlags.Backups.supported else {
guard BuildFlags.Backups.supported else {
return .cancelled
}

View File

@ -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
}

View File

@ -110,7 +110,7 @@ public class OrphanedBackupAttachmentQueueRunnerImpl: OrphanedBackupAttachmentQu
private let errorCounts = ErrorCounts()
func runTask(record: Store.Record, loader: TaskQueueLoader<TaskRunner>) async -> TaskRecordResult {
guard FeatureFlags.Backups.supported else {
guard BuildFlags.Backups.supported else {
return .cancelled
}

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -27,7 +27,7 @@ final class ContactOutputStream {
}
if let aci {
contactBuilder.setAci(aci.serviceIdString)
if FeatureFlags.serviceIdBinaryVariableOverhead {
if BuildFlags.serviceIdBinaryVariableOverhead {
contactBuilder.setAciBinary(aci.serviceIdBinary)
}
}

View File

@ -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)

View File

@ -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)
}

View File

@ -54,7 +54,7 @@ NS_ASSUME_NONNULL_BEGIN
[aciBinaries addObject:aciObj.serviceIdBinary];
}
}
if (FeatureFlagsObjC.serviceIdBinaryVariableOverhead) {
if (BuildFlagsObjC.serviceIdBinaryVariableOverhead) {
[blockedBuilder setAcisBinary:aciBinaries];
}
[blockedBuilder setGroupIds:_groupIds];

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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

View File

@ -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

View File

@ -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()
}

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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];

View File

@ -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)

View File

@ -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;
}
}

View File

@ -56,7 +56,7 @@ class OutgoingPollTerminateMessage: TSOutgoingMessage {
pollTerminateBuilder.buildInfallibly()
)
if !FeatureFlags.pollKeepProtoVersion {
if !BuildFlags.pollKeepProtoVersion {
dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue))
}

View File

@ -82,7 +82,7 @@ public class OutgoingPollVoteMessage: TSOutgoingMessage {
pollVoteBuilder.buildInfallibly()
)
if !FeatureFlags.pollKeepProtoVersion {
if !BuildFlags.pollKeepProtoVersion {
dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue))
}

View File

@ -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)
}

View File

@ -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];

View File

@ -623,7 +623,7 @@ extension TSOutgoingMessage {
@objc
func shouldBumpProtoForPolls() -> Bool {
return !FeatureFlags.pollKeepProtoVersion
return !BuildFlags.pollKeepProtoVersion
}
}

View File

@ -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
}

View File

@ -31,7 +31,7 @@ extension OWSOutgoingReactionMessage {
return nil
}
reactionBuilder.setTargetAuthorAci(messageAuthor.serviceIdString)
if FeatureFlags.serviceIdBinaryConstantOverhead {
if BuildFlags.serviceIdBinaryConstantOverhead {
reactionBuilder.setTargetAuthorAciBinary(messageAuthor.serviceIdBinary)
}

View File

@ -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 })

View File

@ -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)

View File

@ -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)

View File

@ -135,7 +135,7 @@ public class IncrementalMessageTSAttachmentMigratorImpl: IncrementalMessageTSAtt
private func runInMainAppBackground() async {
guard
FeatureFlags.runTSAttachmentMigrationInMainAppBackground,
BuildFlags.runTSAttachmentMigrationInMainAppBackground,
appContext.isMainAppAndActive,
isRunningInMainApp.tryToSetFlag()
else {

View File

@ -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.

View File

@ -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")

View File

@ -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)

View File

@ -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):

View File

@ -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.

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)