Rename FeatureFlags → BuildFlags
This commit is contained in:
parent
7d66b9713b
commit
560cefae94
@ -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):
|
||||
|
||||
@ -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 */,
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -110,7 +110,7 @@ extension ConversationViewController: CVComponentDelegate {
|
||||
itemViewModel: CVItemViewModelImpl,
|
||||
shouldAllowReply: Bool
|
||||
) {
|
||||
guard FeatureFlags.pollSend else {
|
||||
guard BuildFlags.pollSend else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -525,7 +525,7 @@ extension ConversationViewController: ConversationInputToolbarDelegate {
|
||||
public func pollButtonPressed() {
|
||||
AssertIsOnMainThread()
|
||||
|
||||
if !FeatureFlags.pollSend {
|
||||
if !BuildFlags.pollSend {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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),
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -67,7 +67,7 @@ class BackupBGProcessingTaskRunner: BGProcessingTaskRunner {
|
||||
}
|
||||
|
||||
public func startCondition() -> BGProcessingTaskStartCondition {
|
||||
guard FeatureFlags.Backups.supported else {
|
||||
guard BuildFlags.Backups.supported else {
|
||||
return .never
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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] {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -415,7 +415,7 @@ public class OWSTabBar: UITabBar {
|
||||
return
|
||||
}
|
||||
|
||||
if #available(iOS 26, *), FeatureFlags.iOS26SDKIsAvailable {
|
||||
if #available(iOS 26, *), BuildFlags.iOS26SDKIsAvailable {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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() {}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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)"
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@ -133,7 +133,7 @@ public class AttachmentOffloadingManagerImpl: AttachmentOffloadingManager {
|
||||
}
|
||||
|
||||
public func offloadAttachmentsIfNeeded() async throws {
|
||||
guard FeatureFlags.Backups.supported else {
|
||||
guard BuildFlags.Backups.supported else {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@ final class ContactOutputStream {
|
||||
}
|
||||
if let aci {
|
||||
contactBuilder.setAci(aci.serviceIdString)
|
||||
if FeatureFlags.serviceIdBinaryVariableOverhead {
|
||||
if BuildFlags.serviceIdBinaryVariableOverhead {
|
||||
contactBuilder.setAciBinary(aci.serviceIdBinary)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -54,7 +54,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
[aciBinaries addObject:aciObj.serviceIdBinary];
|
||||
}
|
||||
}
|
||||
if (FeatureFlagsObjC.serviceIdBinaryVariableOverhead) {
|
||||
if (BuildFlagsObjC.serviceIdBinaryVariableOverhead) {
|
||||
[blockedBuilder setAcisBinary:aciBinaries];
|
||||
}
|
||||
[blockedBuilder setGroupIds:_groupIds];
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -56,7 +56,7 @@ class OutgoingPollTerminateMessage: TSOutgoingMessage {
|
||||
pollTerminateBuilder.buildInfallibly()
|
||||
)
|
||||
|
||||
if !FeatureFlags.pollKeepProtoVersion {
|
||||
if !BuildFlags.pollKeepProtoVersion {
|
||||
dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue))
|
||||
}
|
||||
|
||||
|
||||
@ -82,7 +82,7 @@ public class OutgoingPollVoteMessage: TSOutgoingMessage {
|
||||
pollVoteBuilder.buildInfallibly()
|
||||
)
|
||||
|
||||
if !FeatureFlags.pollKeepProtoVersion {
|
||||
if !BuildFlags.pollKeepProtoVersion {
|
||||
dataMessageBuilder.setRequiredProtocolVersion(UInt32(SSKProtoDataMessageProtocolVersion.polls.rawValue))
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -623,7 +623,7 @@ extension TSOutgoingMessage {
|
||||
|
||||
@objc
|
||||
func shouldBumpProtoForPolls() -> Bool {
|
||||
return !FeatureFlags.pollKeepProtoVersion
|
||||
return !BuildFlags.pollKeepProtoVersion
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -31,7 +31,7 @@ extension OWSOutgoingReactionMessage {
|
||||
return nil
|
||||
}
|
||||
reactionBuilder.setTargetAuthorAci(messageAuthor.serviceIdString)
|
||||
if FeatureFlags.serviceIdBinaryConstantOverhead {
|
||||
if BuildFlags.serviceIdBinaryConstantOverhead {
|
||||
reactionBuilder.setTargetAuthorAciBinary(messageAuthor.serviceIdBinary)
|
||||
}
|
||||
|
||||
|
||||
@ -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 })
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -135,7 +135,7 @@ public class IncrementalMessageTSAttachmentMigratorImpl: IncrementalMessageTSAtt
|
||||
|
||||
private func runInMainAppBackground() async {
|
||||
guard
|
||||
FeatureFlags.runTSAttachmentMigrationInMainAppBackground,
|
||||
BuildFlags.runTSAttachmentMigrationInMainAppBackground,
|
||||
appContext.isMainAppAndActive,
|
||||
isRunningInMainApp.tryToSetFlag()
|
||||
else {
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user