From 523578f60f790e925cabefe23d23e2d33417c37c Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 8 Dec 2023 17:24:24 -0500 Subject: [PATCH 01/55] add notification service extension --- .../Info.plist | 13 + .../NotificationService.swift | 35 ++ ios/NewExpensify.xcodeproj/project.pbxproj | 567 +++++++++++++++++- 3 files changed, 613 insertions(+), 2 deletions(-) create mode 100644 ios/CustomNotificationServiceExtension/Info.plist create mode 100644 ios/CustomNotificationServiceExtension/NotificationService.swift diff --git a/ios/CustomNotificationServiceExtension/Info.plist b/ios/CustomNotificationServiceExtension/Info.plist new file mode 100644 index 000000000000..57421ebf9b75 --- /dev/null +++ b/ios/CustomNotificationServiceExtension/Info.plist @@ -0,0 +1,13 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift new file mode 100644 index 000000000000..abd04a62fe63 --- /dev/null +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -0,0 +1,35 @@ +// +// NotificationService.swift +// CustomNotificationServiceExtension +// +// Created by Andrew Rosiclair on 12/8/23. +// + +import UserNotifications + +class NotificationService: UNNotificationServiceExtension { + + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + if let bestAttemptContent = bestAttemptContent { + // Modify the notification content here... + bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" + + contentHandler(bestAttemptContent) + } + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } + +} diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 64ed3fda8b02..e8c3c6d7aa52 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -27,9 +27,11 @@ 7041848526A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 7041848626A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 70CF6E82262E297300711ADC /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 70CF6E81262E297300711ADC /* BootSplash.storyboard */; }; + 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */; }; + 7FD73CA22B23CE9500420AF3 /* CustomNotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BDB853621F354EBB84E619C2 /* ExpensifyNewKansas-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */; }; DD79042B2792E76D004484B4 /* RCTBootSplash.m in Sources */ = {isa = PBXBuildFile; fileRef = DD79042A2792E76D004484B4 /* RCTBootSplash.m */; }; - E51DC681C7DEE40AEBDDFBFE /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + E51DC681C7DEE40AEBDDFBFE /* (null) in Frameworks */ = {isa = PBXBuildFile; }; E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; ED222ED90E074A5481A854FA /* ExpensifyNeue-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */; }; F0C450EA2705020500FD2970 /* colors.json in Resources */ = {isa = PBXBuildFile; fileRef = F0C450E92705020500FD2970 /* colors.json */; }; @@ -44,8 +46,29 @@ remoteGlobalIDString = 13B07F861A680F5B00A75B9A; remoteInfo = NewExpensify; }; + 7FD73CA02B23CE9500420AF3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7FD73C9A2B23CE9500420AF3; + remoteInfo = CustomNotificationServiceExtension; + }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 7FD73CA32B23CE9500420AF3 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 7FD73CA22B23CE9500420AF3 /* CustomNotificationServiceExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 00E356EE1AD99517003FC87E /* NewExpensifyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NewExpensifyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -85,6 +108,9 @@ 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTStartupTimer.m; path = NewExpensify/RCTStartupTimer.m; sourceTree = ""; }; 70CF6E81262E297300711ADC /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = NewExpensify/BootSplash.storyboard; sourceTree = ""; }; 75CABB0D0ABB0082FE0EB600 /* Pods-NewExpensify.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release staging.xcconfig"; sourceTree = ""; }; + 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CustomNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; + 7FD73C9F2B23CE9500420AF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8709DF3C8D91F0FC1581CDD7 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; sourceTree = ""; }; 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-BoldItalic.otf"; path = "../assets/fonts/native/ExpensifyNeue-BoldItalic.otf"; sourceTree = ""; }; 8D3B36BF88E773E3C1A383FA /* Pods-NewExpensify.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug staging.xcconfig"; sourceTree = ""; }; @@ -124,11 +150,18 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E51DC681C7DEE40AEBDDFBFE /* BuildFile in Frameworks */, + E51DC681C7DEE40AEBDDFBFE /* (null) in Frameworks */, 5A464BC8112CDB1DE1E38F1C /* libPods-NewExpensify.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; + 7FD73C982B23CE9500420AF3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -177,6 +210,15 @@ name = Frameworks; sourceTree = ""; }; + 7FD73C9C2B23CE9500420AF3 /* CustomNotificationServiceExtension */ = { + isa = PBXGroup; + children = ( + 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */, + 7FD73C9F2B23CE9500420AF3 /* Info.plist */, + ); + path = CustomNotificationServiceExtension; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -198,6 +240,7 @@ 13B07FAE1A68108700A75B9A /* NewExpensify */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* NewExpensifyTests */, + 7FD73C9C2B23CE9500420AF3 /* CustomNotificationServiceExtension */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, EC29677F0A49C2946A495A33 /* Pods */, @@ -213,6 +256,7 @@ children = ( 13B07F961A680F5B00A75B9A /* New Expensify Dev.app */, 00E356EE1AD99517003FC87E /* NewExpensifyTests.xctest */, + 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */, ); name = Products; sourceTree = ""; @@ -305,22 +349,42 @@ 5259EE1448507A682C02026F /* [CP] Copy Pods Resources */, 5E34288ECB69FCFA24851234 /* [CP-User] [RNFB] Core Configuration */, E10553ABAB7762D41AC85C09 /* [CP-User] [RNFB] Crashlytics Configuration */, + 7FD73CA32B23CE9500420AF3 /* Embed Foundation Extensions */, ); buildRules = ( ); dependencies = ( + 7FD73CA12B23CE9500420AF3 /* PBXTargetDependency */, ); name = NewExpensify; productName = NewExpensify; productReference = 13B07F961A680F5B00A75B9A /* New Expensify Dev.app */; productType = "com.apple.product-type.application"; }; + 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "CustomNotificationServiceExtension" */; + buildPhases = ( + 7FD73C972B23CE9500420AF3 /* Sources */, + 7FD73C982B23CE9500420AF3 /* Frameworks */, + 7FD73C992B23CE9500420AF3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CustomNotificationServiceExtension; + productName = CustomNotificationServiceExtension; + productReference = 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 1500; LastUpgradeCheck = 1130; TargetAttributes = { 00E356ED1AD99517003FC87E = { @@ -334,6 +398,11 @@ LastSwiftMigration = 1230; ProvisioningStyle = Manual; }; + 7FD73C9A2B23CE9500420AF3 = { + CreatedOnToolsVersion = 15.0.1; + DevelopmentTeam = 368M544MTT; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "NewExpensify" */; @@ -351,6 +420,7 @@ targets = ( 13B07F861A680F5B00A75B9A /* NewExpensify */, 00E356ED1AD99517003FC87E /* NewExpensifyTests */, + 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */, ); }; /* End PBXProject section */ @@ -384,6 +454,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 7FD73C992B23CE9500420AF3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -654,6 +731,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 7FD73C972B23CE9500420AF3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -662,6 +747,11 @@ target = 13B07F861A680F5B00A75B9A /* NewExpensify */; targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; }; + 7FD73CA12B23CE9500420AF3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */; + targetProxy = 7FD73CA02B23CE9500420AF3 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -717,6 +807,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0B627F2A465153FFA6E3A4E0 /* Pods-NewExpensify.debugdevelopment.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -749,6 +840,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -775,6 +867,460 @@ }; name = ReleaseDevelopment; }; + 7FD73CA42B23CE9500420AF3 /* DebugDevelopment */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugDevelopment; + }; + 7FD73CA52B23CE9500420AF3 /* DebugAdHoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugAdHoc; + }; + 7FD73CA62B23CE9500420AF3 /* DebugProduction */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = DebugProduction; + }; + 7FD73CA72B23CE9500420AF3 /* ReleaseDevelopment */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = ReleaseDevelopment; + }; + 7FD73CA82B23CE9500420AF3 /* ReleaseAdHoc */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = ReleaseAdHoc; + }; + 7FD73CA92B23CE9500420AF3 /* ReleaseProduction */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 368M544MTT; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = ReleaseProduction; + }; 83CBBA201A601CBA00E9B192 /* DebugDevelopment */ = { isa = XCBuildConfiguration; buildSettings = { @@ -968,6 +1514,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = CE2F84BEE9A6DCC228AF7E42 /* Pods-NewExpensify.debugproduction.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1090,6 +1637,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 6F6A514B4DF07A60EC8355BA /* Pods-NewExpensify.debugadhoc.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconAdHoc; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1206,6 +1754,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 47D5DF3C6779D41BE70CD031 /* Pods-NewExpensify.releaseproduction.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1318,6 +1867,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconAdHoc; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1396,6 +1946,19 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = DebugDevelopment; }; + 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "CustomNotificationServiceExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7FD73CA42B23CE9500420AF3 /* DebugDevelopment */, + 7FD73CA52B23CE9500420AF3 /* DebugAdHoc */, + 7FD73CA62B23CE9500420AF3 /* DebugProduction */, + 7FD73CA72B23CE9500420AF3 /* ReleaseDevelopment */, + 7FD73CA82B23CE9500420AF3 /* ReleaseAdHoc */, + 7FD73CA92B23CE9500420AF3 /* ReleaseProduction */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = DebugDevelopment; + }; 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "NewExpensify" */ = { isa = XCConfigurationList; buildConfigurations = ( From 4335e954d8ee9cc67d8d0c42c6a8cfc8afab5aa9 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 8 Dec 2023 17:45:48 -0500 Subject: [PATCH 02/55] move embed extensions build phase to fix build --- ios/NewExpensify.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index e8c3c6d7aa52..6d31c101d486 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -342,6 +342,7 @@ 7E666D03089C35260C905B4A /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, + 7FD73CA32B23CE9500420AF3 /* Embed Foundation Extensions */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, @@ -349,7 +350,6 @@ 5259EE1448507A682C02026F /* [CP] Copy Pods Resources */, 5E34288ECB69FCFA24851234 /* [CP-User] [RNFB] Core Configuration */, E10553ABAB7762D41AC85C09 /* [CP-User] [RNFB] Crashlytics Configuration */, - 7FD73CA32B23CE9500420AF3 /* Embed Foundation Extensions */, ); buildRules = ( ); From 53272e9d053ba8f53c334a13aa484492e5ac4264 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Mon, 11 Dec 2023 14:27:37 -0500 Subject: [PATCH 03/55] use airship's UANotificationServiceExtension --- .../NotificationService.swift | 27 +---------- ios/NewExpensify.xcodeproj/project.pbxproj | 45 +++++++++++++++++++ ios/Podfile | 4 ++ ios/Podfile.lock | 6 ++- 4 files changed, 56 insertions(+), 26 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index abd04a62fe63..6b95f4f49ffb 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -5,31 +5,8 @@ // Created by Andrew Rosiclair on 12/8/23. // -import UserNotifications +import AirshipServiceExtension -class NotificationService: UNNotificationServiceExtension { - - var contentHandler: ((UNNotificationContent) -> Void)? - var bestAttemptContent: UNMutableNotificationContent? - - override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { - self.contentHandler = contentHandler - bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - - if let bestAttemptContent = bestAttemptContent { - // Modify the notification content here... - bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" - - contentHandler(bestAttemptContent) - } - } - - override func serviceExtensionTimeWillExpire() { - // Called just before the extension will be terminated by the system. - // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. - if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { - contentHandler(bestAttemptContent) - } - } +class NotificationService: UANotificationServiceExtension { } diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 6d31c101d486..5a709d370a44 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 059DC4EFD39EF39437E6823D /* libPods-CustomNotificationServiceExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */; }; 0C7C65547D7346EB923BE808 /* ExpensifyMono-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = E704648954784DDFBAADF568 /* ExpensifyMono-Regular.otf */; }; 0CDA8E34287DD650004ECBEC /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0CDA8E33287DD650004ECBEC /* AppDelegate.mm */; }; 0CDA8E35287DD650004ECBEC /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0CDA8E33287DD650004ECBEC /* AppDelegate.mm */; }; @@ -87,6 +88,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NewExpensify/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NewExpensify/main.m; sourceTree = ""; }; 18D050DF262400AF000D658B /* BridgingFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BridgingFile.swift; sourceTree = ""; }; + 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CustomNotificationServiceExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 1DDE5449979A136852B939B5 /* Pods-NewExpensify.release adhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release adhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release adhoc.xcconfig"; sourceTree = ""; }; 25A4587E168FD67CF890B448 /* Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; sourceTree = ""; }; 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releasedevelopment.xcconfig"; sourceTree = ""; }; @@ -114,27 +116,33 @@ 8709DF3C8D91F0FC1581CDD7 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; sourceTree = ""; }; 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-BoldItalic.otf"; path = "../assets/fonts/native/ExpensifyNeue-BoldItalic.otf"; sourceTree = ""; }; 8D3B36BF88E773E3C1A383FA /* Pods-NewExpensify.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug staging.xcconfig"; sourceTree = ""; }; + 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig"; sourceTree = ""; }; 96552D489D9F09B6A5ABD81B /* Pods-NewExpensify-NewExpensifyTests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; sourceTree = ""; }; AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; BD6E1BA27D6ABE0AC9D70586 /* Pods-NewExpensify-NewExpensifyTests.release development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; sourceTree = ""; }; BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releaseadhoc.xcconfig"; sourceTree = ""; }; BF6A4C5167244B9FB8E4D4E3 /* ExpensifyNeue-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-Italic.otf"; path = "../assets/fonts/native/ExpensifyNeue-Italic.otf"; sourceTree = ""; }; + C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugproduction.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugproduction.xcconfig"; sourceTree = ""; }; CE2F84BEE9A6DCC228AF7E42 /* Pods-NewExpensify.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debugproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debugproduction.xcconfig"; sourceTree = ""; }; CECC4CBB97A55705A33BEA9E /* Pods-NewExpensify.debug development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug development.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug development.xcconfig"; sourceTree = ""; }; D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNewKansas-MediumItalic.otf"; path = "../assets/fonts/native/ExpensifyNewKansas-MediumItalic.otf"; sourceTree = ""; }; + D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig"; sourceTree = ""; }; DB76E0D5C670190A0997C71E /* Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig"; sourceTree = ""; }; DCF33E34FFEC48128CDD41D4 /* ExpensifyMono-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyMono-Bold.otf"; path = "../assets/fonts/native/ExpensifyMono-Bold.otf"; sourceTree = ""; }; DD7904292792E76D004484B4 /* RCTBootSplash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTBootSplash.h; path = NewExpensify/RCTBootSplash.h; sourceTree = ""; }; DD79042A2792E76D004484B4 /* RCTBootSplash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTBootSplash.m; path = NewExpensify/RCTBootSplash.m; sourceTree = ""; }; E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; sourceTree = ""; }; E2F1036F70CBFE39E9352674 /* Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; sourceTree = ""; }; + E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig"; sourceTree = ""; }; E704648954784DDFBAADF568 /* ExpensifyMono-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyMono-Regular.otf"; path = "../assets/fonts/native/ExpensifyMono-Regular.otf"; sourceTree = ""; }; E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; + F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig"; sourceTree = ""; }; F0C450E92705020500FD2970 /* colors.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = colors.json; path = ../colors.json; sourceTree = ""; }; F15A36A3262EEC3B0CAB8EDF /* Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig"; sourceTree = ""; }; F4F8A052A22040339996324B /* ExpensifyNeue-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-Regular.otf"; path = "../assets/fonts/native/ExpensifyNeue-Regular.otf"; sourceTree = ""; }; + FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -159,6 +167,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 059DC4EFD39EF39437E6823D /* libPods-CustomNotificationServiceExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -206,6 +215,7 @@ ED2971642150620600B7C4FE /* JavaScriptCore.framework */, AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */, 6FB387B20AE4E6E98858B6AA /* libPods-NewExpensify-NewExpensifyTests.a */, + 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */, ); name = Frameworks; sourceTree = ""; @@ -307,6 +317,12 @@ 4E8BF7B08BA3181991BFCF4B /* Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig */, E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */, 57DBBEDB9692E096D4BA0141 /* Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig */, + FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */, + D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */, + C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */, + F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */, + E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */, + 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */, ); path = Pods; sourceTree = ""; @@ -365,6 +381,7 @@ isa = PBXNativeTarget; buildConfigurationList = 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "CustomNotificationServiceExtension" */; buildPhases = ( + F3D35ED760B830954BD8A7BB /* [CP] Check Pods Manifest.lock */, 7FD73C972B23CE9500420AF3 /* Sources */, 7FD73C982B23CE9500420AF3 /* Frameworks */, 7FD73C992B23CE9500420AF3 /* Resources */, @@ -685,6 +702,28 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; + F3D35ED760B830954BD8A7BB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-CustomNotificationServiceExtension-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -869,6 +908,7 @@ }; 7FD73CA42B23CE9500420AF3 /* DebugDevelopment */ = { isa = XCBuildConfiguration; + baseConfigurationReference = FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -949,6 +989,7 @@ }; 7FD73CA52B23CE9500420AF3 /* DebugAdHoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1028,6 +1069,7 @@ }; 7FD73CA62B23CE9500420AF3 /* DebugProduction */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1107,6 +1149,7 @@ }; 7FD73CA72B23CE9500420AF3 /* ReleaseDevelopment */ = { isa = XCBuildConfiguration; + baseConfigurationReference = F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1179,6 +1222,7 @@ }; 7FD73CA82B23CE9500420AF3 /* ReleaseAdHoc */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1251,6 +1295,7 @@ }; 7FD73CA92B23CE9500420AF3 /* ReleaseProduction */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; diff --git a/ios/Podfile b/ios/Podfile index 6aee4b94df04..2df3d94a013d 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -118,3 +118,7 @@ target 'NewExpensify' do end end end + +target 'CustomNotificationServiceExtension' do + pod 'AirshipServiceExtension' +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0fac30a26430..0c1214344a8f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -20,6 +20,7 @@ PODS: - Airship (= 16.12.1) - Airship/MessageCenter (= 16.12.1) - Airship/PreferenceCenter (= 16.12.1) + - AirshipServiceExtension (16.12.5) - AppAuth (1.6.2): - AppAuth/Core (= 1.6.2) - AppAuth/ExternalUserAgent (= 1.6.2) @@ -828,6 +829,7 @@ PODS: - Yoga (~> 1.14) DEPENDENCIES: + - AirshipServiceExtension - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) - BVLinearGradient (from `../node_modules/react-native-linear-gradient`) - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) @@ -942,6 +944,7 @@ SPEC REPOS: trunk: - Airship - AirshipFrameworkProxy + - AirshipServiceExtension - AppAuth - CocoaAsyncSocket - Firebase @@ -1162,6 +1165,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Airship: 2f4510b497a8200780752a5e0304a9072bfffb6d AirshipFrameworkProxy: ea1b6c665c798637b93c465b5e505be3011f1d9d + AirshipServiceExtension: 89c6e25a69f3458d9dbd581c700cffb196b61930 AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570 boost: 57d2868c099736d80fcd648bf211b4431e51a558 BVLinearGradient: 421743791a59d259aec53f4c58793aad031da2ca @@ -1291,6 +1295,6 @@ SPEC CHECKSUMS: Yoga: 3efc43e0d48686ce2e8c60f99d4e6bd349aff981 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: ff769666b7221c15936ebc5576a8c8e467dc6879 +PODFILE CHECKSUM: c44319b85c142746fd25749dc13f06ce81273f22 COCOAPODS: 1.12.1 From 9f0e214b3e00e5d16de461d6380bda6f1e0843d3 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Mon, 11 Dec 2023 16:11:23 -0500 Subject: [PATCH 04/55] use iOS 13 minimum target --- ios/NewExpensify.xcodeproj/project.pbxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 5a709d370a44..4037bd84e253 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -967,7 +967,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; @@ -1048,7 +1048,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; @@ -1128,7 +1128,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; @@ -1202,7 +1202,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; @@ -1275,7 +1275,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; @@ -1348,7 +1348,7 @@ INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; From 794eb84ea66cdb3f5774874efdd7eb9253f6589b Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Mon, 11 Dec 2023 16:12:04 -0500 Subject: [PATCH 05/55] re-add default implementations --- .../NotificationService.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 6b95f4f49ffb..dc8cb8e561d8 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -9,4 +9,27 @@ import AirshipServiceExtension class NotificationService: UANotificationServiceExtension { + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + if let bestAttemptContent = bestAttemptContent { + // Modify the notification content here... + bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" + + contentHandler(bestAttemptContent) + } + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } + } From 5ff582642f7bae948e1680cc1f5ac141a04f473e Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 12 Dec 2023 12:36:11 -0500 Subject: [PATCH 06/55] check for payload properties --- .../NotificationService.swift | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index dc8cb8e561d8..d9d04e5468f9 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -8,28 +8,45 @@ import AirshipServiceExtension class NotificationService: UANotificationServiceExtension { - - var contentHandler: ((UNNotificationContent) -> Void)? - var bestAttemptContent: UNMutableNotificationContent? - - override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { - self.contentHandler = contentHandler - bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - - if let bestAttemptContent = bestAttemptContent { - // Modify the notification content here... - bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" - - contentHandler(bestAttemptContent) - } - } + + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - override func serviceExtensionTimeWillExpire() { - // Called just before the extension will be terminated by the system. - // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. - if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { - contentHandler(bestAttemptContent) - } + if let bestAttemptContent = bestAttemptContent { + // Modify the notification content here... + bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" + + guard let payload = bestAttemptContent.userInfo["payload"] as? NSDictionary else { + print("[NotificationService] didReceive() - no payload in this notification") + return + } + + guard let reportID = payload["reportID"] as? String else { + print("[NotificationService] didReceive() - no reportID in this notification") + return + } + + guard let onyxData = payload["onyxData"] as? NSArray else { + print("[NotificationService] didReceive() - no onyxData in this notification") + return + } + + + + contentHandler(bestAttemptContent) } - + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } + } From 83c0b93ef16cd50c6b462dcefa4e0d5a94258f5a Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Wed, 13 Dec 2023 14:18:09 -0500 Subject: [PATCH 07/55] use os_log instead of print --- .../NotificationService.swift | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index d9d04e5468f9..97b478fca801 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -6,13 +6,17 @@ // import AirshipServiceExtension +import os.log class NotificationService: UANotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? + let log = OSLog(subsystem: Bundle.main.bundleIdentifier ?? "com.expensify.chat.dev.CustomNotificationServiceExtension", category: "NotificationService") override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + os_log("[NotificationService] didReceive() - received notification", log: log) + self.contentHandler = contentHandler bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) @@ -21,22 +25,20 @@ class NotificationService: UANotificationServiceExtension { bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" guard let payload = bestAttemptContent.userInfo["payload"] as? NSDictionary else { - print("[NotificationService] didReceive() - no payload in this notification") + os_log("[NotificationService] didReceive() - no payload in this notification", log: log, type: .error) return } guard let reportID = payload["reportID"] as? String else { - print("[NotificationService] didReceive() - no reportID in this notification") + os_log("[NotificationService] didReceive() - no reportID in this notification", log: log, type: .error) return } guard let onyxData = payload["onyxData"] as? NSArray else { - print("[NotificationService] didReceive() - no onyxData in this notification") + os_log("[NotificationService] didReceive() - no onyxData in this notification", log: log, type: .error) return } - - contentHandler(bestAttemptContent) } } From 315cf256fa28c942e9f5ade22cd527a4a24cff04 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 11:14:07 -0500 Subject: [PATCH 08/55] Add ExpError for throwing runtime errors with messages --- .../ExpError.swift | 12 ++++++++++++ ios/NewExpensify.xcodeproj/project.pbxproj | 4 ++++ 2 files changed, 16 insertions(+) create mode 100644 ios/CustomNotificationServiceExtension/ExpError.swift diff --git a/ios/CustomNotificationServiceExtension/ExpError.swift b/ios/CustomNotificationServiceExtension/ExpError.swift new file mode 100644 index 000000000000..7760be640936 --- /dev/null +++ b/ios/CustomNotificationServiceExtension/ExpError.swift @@ -0,0 +1,12 @@ +// +// ExpError.swift +// CustomNotificationServiceExtension +// +// Created by Andrew Rosiclair on 12/13/23. +// + +import Foundation + +enum ExpError: Error { + case runtimeError(String) +} diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 4037bd84e253..087c7aa557cc 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -28,6 +28,7 @@ 7041848526A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 7041848626A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 70CF6E82262E297300711ADC /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 70CF6E81262E297300711ADC /* BootSplash.storyboard */; }; + 7F9DD8DA2B2A445B005E3AFA /* ExpError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */; }; 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */; }; 7FD73CA22B23CE9500420AF3 /* CustomNotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BDB853621F354EBB84E619C2 /* ExpensifyNewKansas-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */; }; @@ -110,6 +111,7 @@ 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTStartupTimer.m; path = NewExpensify/RCTStartupTimer.m; sourceTree = ""; }; 70CF6E81262E297300711ADC /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = NewExpensify/BootSplash.storyboard; sourceTree = ""; }; 75CABB0D0ABB0082FE0EB600 /* Pods-NewExpensify.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release staging.xcconfig"; sourceTree = ""; }; + 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpError.swift; sourceTree = ""; }; 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CustomNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 7FD73C9F2B23CE9500420AF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -225,6 +227,7 @@ children = ( 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */, 7FD73C9F2B23CE9500420AF3 /* Info.plist */, + 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */, ); path = CustomNotificationServiceExtension; sourceTree = ""; @@ -774,6 +777,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 7F9DD8DA2B2A445B005E3AFA /* ExpError.swift in Sources */, 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 75bdc80ae34dd0102a4c0aca7368edf379261ed9 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 11:15:04 -0500 Subject: [PATCH 09/55] parse notification data --- .../NotificationService.swift | 92 +++++++++++++++---- 1 file changed, 72 insertions(+), 20 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 97b478fca801..5976f42e9902 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -18,29 +18,65 @@ class NotificationService: UANotificationServiceExtension { os_log("[NotificationService] didReceive() - received notification", log: log) self.contentHandler = contentHandler - bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) - - if let bestAttemptContent = bestAttemptContent { - // Modify the notification content here... + guard let bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) else { + contentHandler(request.content) + return + } + defer { bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" - - guard let payload = bestAttemptContent.userInfo["payload"] as? NSDictionary else { - os_log("[NotificationService] didReceive() - no payload in this notification", log: log, type: .error) - return - } - - guard let reportID = payload["reportID"] as? String else { - os_log("[NotificationService] didReceive() - no reportID in this notification", log: log, type: .error) - return - } - - guard let onyxData = payload["onyxData"] as? NSArray else { - os_log("[NotificationService] didReceive() - no onyxData in this notification", log: log, type: .error) - return - } - contentHandler(bestAttemptContent) } + + var notificationData: NotificationData + do { + notificationData = try parsePayload(notificationContent: bestAttemptContent) + } catch ExpError.runtimeError(let errorMessage) { + os_log("[NotificationService] didReceive() - couldn't parse the payload '%@'", log: log, type: .error, errorMessage) + } catch { + os_log("[NotificationService] didReceive() - unexpected error while parsing payload", log: log, type: .error) + } + } + + func parsePayload(notificationContent: UNMutableNotificationContent) throws -> NotificationData { + guard let payload = notificationContent.userInfo["payload"] as? NSDictionary else { + throw ExpError.runtimeError("payload missing") + } + + guard let reportID = payload["reportID"] as? Int64 else { + throw ExpError.runtimeError("payload.reportID missing") + } + + guard let reportActionID = payload["reportActionID"] as? String else { + throw ExpError.runtimeError("payload.reportActionID missing") + } + + guard let onyxData = payload["onyxData"] as? NSArray else { + throw ExpError.runtimeError("payload.onyxData missing" + reportActionID) + } + + guard let reportActionOnyxUpdate = onyxData[1] as? NSDictionary else { + throw ExpError.runtimeError("payload.onyxData[1] missing" + reportActionID) + } + + guard let reportActionCollection = reportActionOnyxUpdate["value"] as? NSDictionary else { + throw ExpError.runtimeError("payload.onyxData[1].value (report action onyx update) missing" + reportActionID) + } + + guard let reportAction = reportActionCollection[reportActionID] as? NSDictionary else { + throw ExpError.runtimeError("payload.onyxData[1].value['\(reportActionID)'] (report action) is missing" + reportActionID) + } + + guard let avatarURL = reportAction["avatar"] as? String else { + throw ExpError.runtimeError("reportAction.avatar is missing" + reportActionID) + } + + return NotificationData( + reportID: reportID, + reportActionID: reportActionID, + onyxData: onyxData, + reportOnyxUpdate: reportActionOnyxUpdate, + avatarURL: avatarURL + ) } override func serviceExtensionTimeWillExpire() { @@ -52,3 +88,19 @@ class NotificationService: UANotificationServiceExtension { } } + +class NotificationData { + public var reportID: Int64 + public var reportActionID: String + public var onyxData: NSArray + public var reportOnyxUpdate: NSDictionary + public var avatarURL: String + + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String) { + self.reportID = reportID + self.reportActionID = reportActionID + self.onyxData = onyxData + self.reportOnyxUpdate = reportOnyxUpdate + self.avatarURL = avatarURL + } +} From 91d7c7d0b9100710d9f884ae5c3d820675d5eb71 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 16:35:46 -0500 Subject: [PATCH 10/55] parse accountID --- .../NotificationService.swift | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 5976f42e9902..30b955ada2d2 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -63,11 +63,15 @@ class NotificationService: UANotificationServiceExtension { } guard let reportAction = reportActionCollection[reportActionID] as? NSDictionary else { - throw ExpError.runtimeError("payload.onyxData[1].value['\(reportActionID)'] (report action) is missing" + reportActionID) + throw ExpError.runtimeError("payload.onyxData[1].value['\(reportActionID)'] (report action) missing" + reportActionID) } guard let avatarURL = reportAction["avatar"] as? String else { - throw ExpError.runtimeError("reportAction.avatar is missing" + reportActionID) + throw ExpError.runtimeError("reportAction.avatar missing. reportActionID: " + reportActionID) + } + + guard let accountID = reportAction["actorAccountID"] as? Int else { + throw ExpError.runtimeError("reportAction.actorAccountID missing. reportActionID: " + reportActionID) } return NotificationData( @@ -75,7 +79,8 @@ class NotificationService: UANotificationServiceExtension { reportActionID: reportActionID, onyxData: onyxData, reportOnyxUpdate: reportActionOnyxUpdate, - avatarURL: avatarURL + avatarURL: avatarURL, + accountID: accountID ) } @@ -95,12 +100,14 @@ class NotificationData { public var onyxData: NSArray public var reportOnyxUpdate: NSDictionary public var avatarURL: String + public var accountID: Int - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String) { + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int) { self.reportID = reportID self.reportActionID = reportActionID self.onyxData = onyxData self.reportOnyxUpdate = reportOnyxUpdate self.avatarURL = avatarURL + self.accountID = accountID } } From 73a49b6d10f7ff1ccba98c4099a0aa5d04a469bd Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 16:46:54 -0500 Subject: [PATCH 11/55] parse the user's name --- .../NotificationService.swift | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 30b955ada2d2..dc49f735770e 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -74,13 +74,26 @@ class NotificationService: UANotificationServiceExtension { throw ExpError.runtimeError("reportAction.actorAccountID missing. reportActionID: " + reportActionID) } + guard let person = reportAction["person"] as? NSArray else { + throw ExpError.runtimeError("reportAction.person missing. reportActionID: " + reportActionID) + } + + guard let personObject = person[0] as? NSDictionary else { + throw ExpError.runtimeError("reportAction.person[0] missing. reportActionID: " + reportActionID) + } + + guard let userName = personObject["text"] as? String else { + throw ExpError.runtimeError("reportAction.person[0].text missing. reportActionID: " + reportActionID) + } + return NotificationData( reportID: reportID, reportActionID: reportActionID, onyxData: onyxData, reportOnyxUpdate: reportActionOnyxUpdate, avatarURL: avatarURL, - accountID: accountID + accountID: accountID, + userName: userName ) } @@ -101,13 +114,15 @@ class NotificationData { public var reportOnyxUpdate: NSDictionary public var avatarURL: String public var accountID: Int + public var userName: String - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int) { + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String) { self.reportID = reportID self.reportActionID = reportActionID self.onyxData = onyxData self.reportOnyxUpdate = reportOnyxUpdate self.avatarURL = avatarURL self.accountID = accountID + self.userName = userName } } From b7c5cdb7109364b954c7c7a88dc7763d504a6e1b Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 17:01:01 -0500 Subject: [PATCH 12/55] add communication notification entitlement --- ios/NewExpensify/Chat.entitlements | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/NewExpensify/Chat.entitlements b/ios/NewExpensify/Chat.entitlements index 5300e35eadbf..165745a3c1a0 100644 --- a/ios/NewExpensify/Chat.entitlements +++ b/ios/NewExpensify/Chat.entitlements @@ -14,5 +14,7 @@ applinks:staging.new.expensify.com webcredentials:new.expensify.com + com.apple.developer.usernotifications.communication + From 4707abaf0a9181aa1991dfb425cd62078217a471 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Thu, 14 Dec 2023 17:14:31 -0500 Subject: [PATCH 13/55] add INSendMessageIntent --- ios/CustomNotificationServiceExtension/Info.plist | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ios/CustomNotificationServiceExtension/Info.plist b/ios/CustomNotificationServiceExtension/Info.plist index 57421ebf9b75..88b7c52d8732 100644 --- a/ios/CustomNotificationServiceExtension/Info.plist +++ b/ios/CustomNotificationServiceExtension/Info.plist @@ -8,6 +8,10 @@ com.apple.usernotifications.service NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).NotificationService + NSUserActivityTypes + + INSendMessageIntent + From de5d1262b12b6034655d9d2e5841a04764f15bb4 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 15:34:36 -0500 Subject: [PATCH 14/55] move NSUserActivityTypes to the main bundle --- ios/CustomNotificationServiceExtension/Info.plist | 4 ---- ios/NewExpensify/Info.plist | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/Info.plist b/ios/CustomNotificationServiceExtension/Info.plist index 88b7c52d8732..57421ebf9b75 100644 --- a/ios/CustomNotificationServiceExtension/Info.plist +++ b/ios/CustomNotificationServiceExtension/Info.plist @@ -8,10 +8,6 @@ com.apple.usernotifications.service NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).NotificationService - NSUserActivityTypes - - INSendMessageIntent - diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index a917b6a4499c..d0c2dc6762bc 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -124,5 +124,9 @@ Dark UIViewControllerBasedStatusBarAppearance + NSUserActivityTypes + + INSendMessageIntent + From fbc2eb10c9a961136e8fe8dadba854b611c3ff9e Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 15:37:15 -0500 Subject: [PATCH 15/55] create message intents and configure communication notifications --- .../NotificationService.swift | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index dc49f735770e..63c07ec90462 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -7,6 +7,7 @@ import AirshipServiceExtension import os.log +import Intents class NotificationService: UANotificationServiceExtension { @@ -22,18 +23,60 @@ class NotificationService: UANotificationServiceExtension { contentHandler(request.content) return } - defer { - bestAttemptContent.title = "\(bestAttemptContent.title) [modified]" + + if #available(iOSApplicationExtension 15.0, *) { + configureCommunicationNotification(notificationContent: bestAttemptContent, contentHandler: contentHandler) + } else { contentHandler(bestAttemptContent) } - + } + + @available(iOSApplicationExtension 15.0, *) + func configureCommunicationNotification(notificationContent: UNMutableNotificationContent, contentHandler: @escaping (UNNotificationContent) -> Void) { var notificationData: NotificationData do { - notificationData = try parsePayload(notificationContent: bestAttemptContent) + notificationData = try parsePayload(notificationContent: notificationContent) } catch ExpError.runtimeError(let errorMessage) { - os_log("[NotificationService] didReceive() - couldn't parse the payload '%@'", log: log, type: .error, errorMessage) + os_log("[NotificationService] configureCommunicationNotification() - couldn't parse the payload '%@'", log: log, type: .error, errorMessage) + contentHandler(notificationContent) + return } catch { - os_log("[NotificationService] didReceive() - unexpected error while parsing payload", log: log, type: .error) + os_log("[NotificationService] configureCommunicationNotification() - unexpected error while parsing payload", log: log, type: .error) + contentHandler(notificationContent) + return + } + + // Create an intent for the incoming message + let intent: INSendMessageIntent = createMessageIntent(notificationData: notificationData) + + // Use the intent to initialize the interaction. + let interaction = INInteraction(intent: intent, response: nil) + + + // Interaction direction is incoming because the user is + // receiving this message. + interaction.direction = .incoming + + + // Donate the interaction before updating notification content. + interaction.donate { error in + if let error = error { + // Handle errors that may occur during donation. + return + } + + // After donation, update the notification content. + do { + // Update notification content before displaying the + // communication notification. + let updatedContent = try notificationContent.updating(from: intent) + + // Call the content handler with the updated content + // to display the communication notification. + contentHandler(updatedContent) + } catch { + os_log("[NotificationService] configureCommunicationNotification() - failed to update the notification with send message intent", log: self.log, type: .error) + } } } @@ -97,6 +140,30 @@ class NotificationService: UANotificationServiceExtension { ) } + func createMessageIntent(notificationData: NotificationData) -> INSendMessageIntent { + // Initialize only the sender for a one-to-one message intent. + let handle = INPersonHandle(value: String(notificationData.accountID), type: .unknown) + let avatar = INImage(named: "profilepicture.png") + let sender = INPerson(personHandle: handle, + nameComponents: nil, + displayName: notificationData.userName, + image: avatar, + contactIdentifier: nil, + customIdentifier: nil) + + + // Because this communication is incoming, you can infer that the current user is + // a recipient. Don't include the current user when initializing the intent. + let intent = INSendMessageIntent(recipients: nil, + content: "Message content", + speakableGroupName: nil, + conversationIdentifier: String(notificationData.reportID), + serviceName: nil, + sender: sender) + + return intent + } + override func serviceExtensionTimeWillExpire() { // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. From c0d636eec73d0538225dd171d8edf7296e6effcc Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 15:57:28 -0500 Subject: [PATCH 16/55] parse message text --- .../NotificationService.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 63c07ec90462..2116266582f1 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -136,7 +136,8 @@ class NotificationService: UANotificationServiceExtension { reportOnyxUpdate: reportActionOnyxUpdate, avatarURL: avatarURL, accountID: accountID, - userName: userName + userName: userName, + messageText: notificationContent.body ) } @@ -155,7 +156,7 @@ class NotificationService: UANotificationServiceExtension { // Because this communication is incoming, you can infer that the current user is // a recipient. Don't include the current user when initializing the intent. let intent = INSendMessageIntent(recipients: nil, - content: "Message content", + content: notificationData.messageText, speakableGroupName: nil, conversationIdentifier: String(notificationData.reportID), serviceName: nil, @@ -182,8 +183,9 @@ class NotificationData { public var avatarURL: String public var accountID: Int public var userName: String + public var messageText: String - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String) { + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, messageText: String) { self.reportID = reportID self.reportActionID = reportActionID self.onyxData = onyxData @@ -191,5 +193,6 @@ class NotificationData { self.avatarURL = avatarURL self.accountID = accountID self.userName = userName + self.messageText = messageText } } From e61d24295e0b576c69b093cca94243199d3d1245 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 16:03:11 -0500 Subject: [PATCH 17/55] use updated INSendMessageIntent --- .../NotificationService.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 2116266582f1..04e635120c59 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -141,6 +141,7 @@ class NotificationService: UANotificationServiceExtension { ) } + @available(iOSApplicationExtension 14.0, *) func createMessageIntent(notificationData: NotificationData) -> INSendMessageIntent { // Initialize only the sender for a one-to-one message intent. let handle = INPersonHandle(value: String(notificationData.accountID), type: .unknown) @@ -156,11 +157,13 @@ class NotificationService: UANotificationServiceExtension { // Because this communication is incoming, you can infer that the current user is // a recipient. Don't include the current user when initializing the intent. let intent = INSendMessageIntent(recipients: nil, + outgoingMessageType: .outgoingMessageText, content: notificationData.messageText, speakableGroupName: nil, conversationIdentifier: String(notificationData.reportID), serviceName: nil, - sender: sender) + sender: sender, + attachments: nil) return intent } From 82245cf16f34a7c376f0659a86d8495044bef804 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 16:20:34 -0500 Subject: [PATCH 18/55] fetch and use avatar --- .../NotificationService.swift | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 04e635120c59..52af88f24021 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -145,7 +145,7 @@ class NotificationService: UANotificationServiceExtension { func createMessageIntent(notificationData: NotificationData) -> INSendMessageIntent { // Initialize only the sender for a one-to-one message intent. let handle = INPersonHandle(value: String(notificationData.accountID), type: .unknown) - let avatar = INImage(named: "profilepicture.png") + let avatar = fetchINImage(imageURL: notificationData.avatarURL, reportActionID: notificationData.reportActionID) let sender = INPerson(personHandle: handle, nameComponents: nil, displayName: notificationData.userName, @@ -176,6 +176,19 @@ class NotificationService: UANotificationServiceExtension { } } + func fetchINImage(imageURL: String, reportActionID: String) -> INImage? { + guard let url = URL(string: imageURL) else { + return nil + } + + do { + let data = try Data(contentsOf: url) + return INImage(imageData: data) + } catch { + os_log("[NotificationService] fetchINImage() - failed to fetch avatar. reportActionID: %@", log: self.log, type: .error, reportActionID) + return nil + } + } } class NotificationData { From 2e22250d59a29d978feaf2aa3c81762af5858196 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 16:26:30 -0500 Subject: [PATCH 19/55] error handling --- .../NotificationService.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 52af88f24021..28107f614e4f 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -61,7 +61,8 @@ class NotificationService: UANotificationServiceExtension { // Donate the interaction before updating notification content. interaction.donate { error in if let error = error { - // Handle errors that may occur during donation. + os_log("[NotificationService] configureCommunicationNotification() - failed to donate the message intent", log: self.log, type: .error) + contentHandler(notificationContent) return } @@ -76,6 +77,7 @@ class NotificationService: UANotificationServiceExtension { contentHandler(updatedContent) } catch { os_log("[NotificationService] configureCommunicationNotification() - failed to update the notification with send message intent", log: self.log, type: .error) + contentHandler(notificationContent) } } } From 718222ebce9233c1f8aa2c8766818b0463fa4cdd Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Fri, 15 Dec 2023 17:08:45 -0500 Subject: [PATCH 20/55] parse and use roomName --- .../NotificationService.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 28107f614e4f..72c59cfa0d51 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -139,7 +139,8 @@ class NotificationService: UANotificationServiceExtension { avatarURL: avatarURL, accountID: accountID, userName: userName, - messageText: notificationContent.body + messageText: notificationContent.body, + roomName: payload["roomName"] as? String ) } @@ -158,10 +159,11 @@ class NotificationService: UANotificationServiceExtension { // Because this communication is incoming, you can infer that the current user is // a recipient. Don't include the current user when initializing the intent. + let roomName = INSpeakableString(spokenPhrase: notificationData.roomName ?? "") let intent = INSendMessageIntent(recipients: nil, outgoingMessageType: .outgoingMessageText, content: notificationData.messageText, - speakableGroupName: nil, + speakableGroupName: roomName, conversationIdentifier: String(notificationData.reportID), serviceName: nil, sender: sender, @@ -202,8 +204,9 @@ class NotificationData { public var accountID: Int public var userName: String public var messageText: String + public var roomName: String? - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, messageText: String) { + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, messageText: String, roomName: String?) { self.reportID = reportID self.reportActionID = reportActionID self.onyxData = onyxData @@ -212,5 +215,6 @@ class NotificationData { self.accountID = accountID self.userName = userName self.messageText = messageText + self.roomName = roomName } } From bad32ec452d92ad68c20f06350ab9d68d89aef87 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 13:41:48 -0500 Subject: [PATCH 21/55] use formatted title --- .../NotificationService.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 72c59cfa0d51..8eeb07d2181f 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -139,6 +139,7 @@ class NotificationService: UANotificationServiceExtension { avatarURL: avatarURL, accountID: accountID, userName: userName, + title: notificationContent.title, messageText: notificationContent.body, roomName: payload["roomName"] as? String ) @@ -151,7 +152,7 @@ class NotificationService: UANotificationServiceExtension { let avatar = fetchINImage(imageURL: notificationData.avatarURL, reportActionID: notificationData.reportActionID) let sender = INPerson(personHandle: handle, nameComponents: nil, - displayName: notificationData.userName, + displayName: notificationData.title, image: avatar, contactIdentifier: nil, customIdentifier: nil) @@ -203,10 +204,11 @@ class NotificationData { public var avatarURL: String public var accountID: Int public var userName: String + public var title: String public var messageText: String public var roomName: String? - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, messageText: String, roomName: String?) { + public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, title: String, messageText: String, roomName: String?) { self.reportID = reportID self.reportActionID = reportActionID self.onyxData = onyxData @@ -214,6 +216,7 @@ class NotificationData { self.avatarURL = avatarURL self.accountID = accountID self.userName = userName + self.title = title self.messageText = messageText self.roomName = roomName } From b57be153b442fc66275b6fb181c1104812939b41 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 13:45:03 -0500 Subject: [PATCH 22/55] remove unused NotificationData properties --- .../NotificationService.swift | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 8eeb07d2181f..8019070c0cb8 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -134,8 +134,6 @@ class NotificationService: UANotificationServiceExtension { return NotificationData( reportID: reportID, reportActionID: reportActionID, - onyxData: onyxData, - reportOnyxUpdate: reportActionOnyxUpdate, avatarURL: avatarURL, accountID: accountID, userName: userName, @@ -199,8 +197,6 @@ class NotificationService: UANotificationServiceExtension { class NotificationData { public var reportID: Int64 public var reportActionID: String - public var onyxData: NSArray - public var reportOnyxUpdate: NSDictionary public var avatarURL: String public var accountID: Int public var userName: String @@ -208,11 +204,9 @@ class NotificationData { public var messageText: String public var roomName: String? - public init (reportID: Int64, reportActionID: String, onyxData: NSArray, reportOnyxUpdate: NSDictionary, avatarURL: String, accountID: Int, userName: String, title: String, messageText: String, roomName: String?) { + public init (reportID: Int64, reportActionID: String, avatarURL: String, accountID: Int, userName: String, title: String, messageText: String, roomName: String?) { self.reportID = reportID self.reportActionID = reportActionID - self.onyxData = onyxData - self.reportOnyxUpdate = reportOnyxUpdate self.avatarURL = avatarURL self.accountID = accountID self.userName = userName From 8942cd0ef0b029fce1e4de155fd629577b0a9ace Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 13:46:12 -0500 Subject: [PATCH 23/55] remove unused var --- .../NotificationService.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/CustomNotificationServiceExtension/NotificationService.swift index 8019070c0cb8..508d47799d34 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/CustomNotificationServiceExtension/NotificationService.swift @@ -60,7 +60,7 @@ class NotificationService: UANotificationServiceExtension { // Donate the interaction before updating notification content. interaction.donate { error in - if let error = error { + if error != nil { os_log("[NotificationService] configureCommunicationNotification() - failed to donate the message intent", log: self.log, type: .error) contentHandler(notificationContent) return From 640eaa08d0ed88791117930ddb1a9219efca772f Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 14:12:38 -0500 Subject: [PATCH 24/55] rename to just NotificationServiceExtension --- ios/NewExpensify.xcodeproj/project.pbxproj | 114 +++++++++--------- .../ExpError.swift | 2 +- .../Info.plist | 0 .../NotificationService.swift | 4 +- ios/Podfile | 2 +- ios/Podfile.lock | 2 +- 6 files changed, 62 insertions(+), 62 deletions(-) rename ios/{CustomNotificationServiceExtension => NotificationServiceExtension}/ExpError.swift (79%) rename ios/{CustomNotificationServiceExtension => NotificationServiceExtension}/Info.plist (100%) rename ios/{CustomNotificationServiceExtension => NotificationServiceExtension}/NotificationService.swift (98%) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 087c7aa557cc..fa5384a9944f 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 059DC4EFD39EF39437E6823D /* libPods-CustomNotificationServiceExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */; }; + 059DC4EFD39EF39437E6823D /* libPods-NotificationServiceExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A997AA8204EA3D90907FA80 /* libPods-NotificationServiceExtension.a */; }; 0C7C65547D7346EB923BE808 /* ExpensifyMono-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = E704648954784DDFBAADF568 /* ExpensifyMono-Regular.otf */; }; 0CDA8E34287DD650004ECBEC /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0CDA8E33287DD650004ECBEC /* AppDelegate.mm */; }; 0CDA8E35287DD650004ECBEC /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0CDA8E33287DD650004ECBEC /* AppDelegate.mm */; }; @@ -30,7 +30,7 @@ 70CF6E82262E297300711ADC /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 70CF6E81262E297300711ADC /* BootSplash.storyboard */; }; 7F9DD8DA2B2A445B005E3AFA /* ExpError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */; }; 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */; }; - 7FD73CA22B23CE9500420AF3 /* CustomNotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 7FD73CA22B23CE9500420AF3 /* NotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; BDB853621F354EBB84E619C2 /* ExpensifyNewKansas-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */; }; DD79042B2792E76D004484B4 /* RCTBootSplash.m in Sources */ = {isa = PBXBuildFile; fileRef = DD79042A2792E76D004484B4 /* RCTBootSplash.m */; }; E51DC681C7DEE40AEBDDFBFE /* (null) in Frameworks */ = {isa = PBXBuildFile; }; @@ -53,7 +53,7 @@ containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; proxyType = 1; remoteGlobalIDString = 7FD73C9A2B23CE9500420AF3; - remoteInfo = CustomNotificationServiceExtension; + remoteInfo = NotificationServiceExtension; }; /* End PBXContainerItemProxy section */ @@ -64,7 +64,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - 7FD73CA22B23CE9500420AF3 /* CustomNotificationServiceExtension.appex in Embed Foundation Extensions */, + 7FD73CA22B23CE9500420AF3 /* NotificationServiceExtension.appex in Embed Foundation Extensions */, ); name = "Embed Foundation Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -89,7 +89,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = NewExpensify/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = NewExpensify/main.m; sourceTree = ""; }; 18D050DF262400AF000D658B /* BridgingFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BridgingFile.swift; sourceTree = ""; }; - 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CustomNotificationServiceExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A997AA8204EA3D90907FA80 /* libPods-NotificationServiceExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NotificationServiceExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 1DDE5449979A136852B939B5 /* Pods-NewExpensify.release adhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release adhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release adhoc.xcconfig"; sourceTree = ""; }; 25A4587E168FD67CF890B448 /* Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; sourceTree = ""; }; 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releasedevelopment.xcconfig"; sourceTree = ""; }; @@ -112,39 +112,39 @@ 70CF6E81262E297300711ADC /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = NewExpensify/BootSplash.storyboard; sourceTree = ""; }; 75CABB0D0ABB0082FE0EB600 /* Pods-NewExpensify.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release staging.xcconfig"; sourceTree = ""; }; 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpError.swift; sourceTree = ""; }; - 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = CustomNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 7FD73C9F2B23CE9500420AF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8709DF3C8D91F0FC1581CDD7 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; sourceTree = ""; }; 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-BoldItalic.otf"; path = "../assets/fonts/native/ExpensifyNeue-BoldItalic.otf"; sourceTree = ""; }; 8D3B36BF88E773E3C1A383FA /* Pods-NewExpensify.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug staging.xcconfig"; sourceTree = ""; }; - 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig"; sourceTree = ""; }; + 90E08F0C8C924EDA018C8866 /* Pods-NotificationServiceExtension.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releaseproduction.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releaseproduction.xcconfig"; sourceTree = ""; }; 96552D489D9F09B6A5ABD81B /* Pods-NewExpensify-NewExpensifyTests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; sourceTree = ""; }; AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; BD6E1BA27D6ABE0AC9D70586 /* Pods-NewExpensify-NewExpensifyTests.release development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; sourceTree = ""; }; BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releaseadhoc.xcconfig"; sourceTree = ""; }; BF6A4C5167244B9FB8E4D4E3 /* ExpensifyNeue-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-Italic.otf"; path = "../assets/fonts/native/ExpensifyNeue-Italic.otf"; sourceTree = ""; }; - C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugproduction.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugproduction.xcconfig"; sourceTree = ""; }; + C3FF914C045A138C061D306E /* Pods-NotificationServiceExtension.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.debugproduction.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.debugproduction.xcconfig"; sourceTree = ""; }; CE2F84BEE9A6DCC228AF7E42 /* Pods-NewExpensify.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debugproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debugproduction.xcconfig"; sourceTree = ""; }; CECC4CBB97A55705A33BEA9E /* Pods-NewExpensify.debug development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug development.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug development.xcconfig"; sourceTree = ""; }; D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNewKansas-MediumItalic.otf"; path = "../assets/fonts/native/ExpensifyNewKansas-MediumItalic.otf"; sourceTree = ""; }; - D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig"; sourceTree = ""; }; + D3F458C994019E6A571461B7 /* Pods-NotificationServiceExtension.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.debugadhoc.xcconfig"; sourceTree = ""; }; DB76E0D5C670190A0997C71E /* Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig"; sourceTree = ""; }; DCF33E34FFEC48128CDD41D4 /* ExpensifyMono-Bold.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyMono-Bold.otf"; path = "../assets/fonts/native/ExpensifyMono-Bold.otf"; sourceTree = ""; }; DD7904292792E76D004484B4 /* RCTBootSplash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTBootSplash.h; path = NewExpensify/RCTBootSplash.h; sourceTree = ""; }; DD79042A2792E76D004484B4 /* RCTBootSplash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTBootSplash.m; path = NewExpensify/RCTBootSplash.m; sourceTree = ""; }; E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; sourceTree = ""; }; E2F1036F70CBFE39E9352674 /* Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; sourceTree = ""; }; - E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig"; sourceTree = ""; }; + E61AD6D2DE65B6FB14945CDF /* Pods-NotificationServiceExtension.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; sourceTree = ""; }; E704648954784DDFBAADF568 /* ExpensifyMono-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyMono-Regular.otf"; path = "../assets/fonts/native/ExpensifyMono-Regular.otf"; sourceTree = ""; }; E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; - F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig"; sourceTree = ""; }; + F082D95EE104912B48EA98BA /* Pods-NotificationServiceExtension.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releasedevelopment.xcconfig"; sourceTree = ""; }; F0C450E92705020500FD2970 /* colors.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = colors.json; path = ../colors.json; sourceTree = ""; }; F15A36A3262EEC3B0CAB8EDF /* Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig"; sourceTree = ""; }; F4F8A052A22040339996324B /* ExpensifyNeue-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-Regular.otf"; path = "../assets/fonts/native/ExpensifyNeue-Regular.otf"; sourceTree = ""; }; - FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-CustomNotificationServiceExtension/Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig"; sourceTree = ""; }; + FBEBA6FBED49FB41D6F93896 /* Pods-NotificationServiceExtension.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.debugdevelopment.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -169,7 +169,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 059DC4EFD39EF39437E6823D /* libPods-CustomNotificationServiceExtension.a in Frameworks */, + 059DC4EFD39EF39437E6823D /* libPods-NotificationServiceExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -217,19 +217,19 @@ ED2971642150620600B7C4FE /* JavaScriptCore.framework */, AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */, 6FB387B20AE4E6E98858B6AA /* libPods-NewExpensify-NewExpensifyTests.a */, - 1A997AA8204EA3D90907FA80 /* libPods-CustomNotificationServiceExtension.a */, + 1A997AA8204EA3D90907FA80 /* libPods-NotificationServiceExtension.a */, ); name = Frameworks; sourceTree = ""; }; - 7FD73C9C2B23CE9500420AF3 /* CustomNotificationServiceExtension */ = { + 7FD73C9C2B23CE9500420AF3 /* NotificationServiceExtension */ = { isa = PBXGroup; children = ( 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */, 7FD73C9F2B23CE9500420AF3 /* Info.plist */, 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */, ); - path = CustomNotificationServiceExtension; + path = NotificationServiceExtension; sourceTree = ""; }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { @@ -253,7 +253,7 @@ 13B07FAE1A68108700A75B9A /* NewExpensify */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* NewExpensifyTests */, - 7FD73C9C2B23CE9500420AF3 /* CustomNotificationServiceExtension */, + 7FD73C9C2B23CE9500420AF3 /* NotificationServiceExtension */, 83CBBA001A601CBA00E9B192 /* Products */, 2D16E6871FA4F8E400B85C8A /* Frameworks */, EC29677F0A49C2946A495A33 /* Pods */, @@ -269,7 +269,7 @@ children = ( 13B07F961A680F5B00A75B9A /* New Expensify Dev.app */, 00E356EE1AD99517003FC87E /* NewExpensifyTests.xctest */, - 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */, + 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */, ); name = Products; sourceTree = ""; @@ -320,12 +320,12 @@ 4E8BF7B08BA3181991BFCF4B /* Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig */, E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */, 57DBBEDB9692E096D4BA0141 /* Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig */, - FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */, - D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */, - C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */, - F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */, - E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */, - 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */, + FBEBA6FBED49FB41D6F93896 /* Pods-NotificationServiceExtension.debugdevelopment.xcconfig */, + D3F458C994019E6A571461B7 /* Pods-NotificationServiceExtension.debugadhoc.xcconfig */, + C3FF914C045A138C061D306E /* Pods-NotificationServiceExtension.debugproduction.xcconfig */, + F082D95EE104912B48EA98BA /* Pods-NotificationServiceExtension.releasedevelopment.xcconfig */, + E61AD6D2DE65B6FB14945CDF /* Pods-NotificationServiceExtension.releaseadhoc.xcconfig */, + 90E08F0C8C924EDA018C8866 /* Pods-NotificationServiceExtension.releaseproduction.xcconfig */, ); path = Pods; sourceTree = ""; @@ -380,9 +380,9 @@ productReference = 13B07F961A680F5B00A75B9A /* New Expensify Dev.app */; productType = "com.apple.product-type.application"; }; - 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */ = { + 7FD73C9A2B23CE9500420AF3 /* NotificationServiceExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "CustomNotificationServiceExtension" */; + buildConfigurationList = 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "NotificationServiceExtension" */; buildPhases = ( F3D35ED760B830954BD8A7BB /* [CP] Check Pods Manifest.lock */, 7FD73C972B23CE9500420AF3 /* Sources */, @@ -393,9 +393,9 @@ ); dependencies = ( ); - name = CustomNotificationServiceExtension; - productName = CustomNotificationServiceExtension; - productReference = 7FD73C9B2B23CE9500420AF3 /* CustomNotificationServiceExtension.appex */; + name = NotificationServiceExtension; + productName = NotificationServiceExtension; + productReference = 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */; productType = "com.apple.product-type.app-extension"; }; /* End PBXNativeTarget section */ @@ -440,7 +440,7 @@ targets = ( 13B07F861A680F5B00A75B9A /* NewExpensify */, 00E356ED1AD99517003FC87E /* NewExpensifyTests */, - 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */, + 7FD73C9A2B23CE9500420AF3 /* NotificationServiceExtension */, ); }; /* End PBXProject section */ @@ -720,7 +720,7 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-CustomNotificationServiceExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-NotificationServiceExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -792,7 +792,7 @@ }; 7FD73CA12B23CE9500420AF3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 7FD73C9A2B23CE9500420AF3 /* CustomNotificationServiceExtension */; + target = 7FD73C9A2B23CE9500420AF3 /* NotificationServiceExtension */; targetProxy = 7FD73CA02B23CE9500420AF3 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -912,7 +912,7 @@ }; 7FD73CA42B23CE9500420AF3 /* DebugDevelopment */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FBEBA6FBED49FB41D6F93896 /* Pods-CustomNotificationServiceExtension.debugdevelopment.xcconfig */; + baseConfigurationReference = FBEBA6FBED49FB41D6F93896 /* Pods-NotificationServiceExtension.debugdevelopment.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -968,8 +968,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -978,7 +978,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; @@ -993,7 +993,7 @@ }; 7FD73CA52B23CE9500420AF3 /* DebugAdHoc */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D3F458C994019E6A571461B7 /* Pods-CustomNotificationServiceExtension.debugadhoc.xcconfig */; + baseConfigurationReference = D3F458C994019E6A571461B7 /* Pods-NotificationServiceExtension.debugadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1049,8 +1049,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -1059,7 +1059,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1073,7 +1073,7 @@ }; 7FD73CA62B23CE9500420AF3 /* DebugProduction */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C3FF914C045A138C061D306E /* Pods-CustomNotificationServiceExtension.debugproduction.xcconfig */; + baseConfigurationReference = C3FF914C045A138C061D306E /* Pods-NotificationServiceExtension.debugproduction.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1129,8 +1129,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -1139,7 +1139,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1153,7 +1153,7 @@ }; 7FD73CA72B23CE9500420AF3 /* ReleaseDevelopment */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F082D95EE104912B48EA98BA /* Pods-CustomNotificationServiceExtension.releasedevelopment.xcconfig */; + baseConfigurationReference = F082D95EE104912B48EA98BA /* Pods-NotificationServiceExtension.releasedevelopment.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1203,8 +1203,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -1212,7 +1212,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1226,7 +1226,7 @@ }; 7FD73CA82B23CE9500420AF3 /* ReleaseAdHoc */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E61AD6D2DE65B6FB14945CDF /* Pods-CustomNotificationServiceExtension.releaseadhoc.xcconfig */; + baseConfigurationReference = E61AD6D2DE65B6FB14945CDF /* Pods-NotificationServiceExtension.releaseadhoc.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1276,8 +1276,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -1285,7 +1285,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1299,7 +1299,7 @@ }; 7FD73CA92B23CE9500420AF3 /* ReleaseProduction */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 90E08F0C8C924EDA018C8866 /* Pods-CustomNotificationServiceExtension.releaseproduction.xcconfig */; + baseConfigurationReference = 90E08F0C8C924EDA018C8866 /* Pods-NotificationServiceExtension.releaseproduction.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1349,8 +1349,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = CustomNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = CustomNotificationServiceExtension; + INFOPLIST_FILE = NotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; @@ -1358,7 +1358,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.CustomNotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1995,7 +1995,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = DebugDevelopment; }; - 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "CustomNotificationServiceExtension" */ = { + 7FD73CAA2B23CE9500420AF3 /* Build configuration list for PBXNativeTarget "NotificationServiceExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( 7FD73CA42B23CE9500420AF3 /* DebugDevelopment */, diff --git a/ios/CustomNotificationServiceExtension/ExpError.swift b/ios/NotificationServiceExtension/ExpError.swift similarity index 79% rename from ios/CustomNotificationServiceExtension/ExpError.swift rename to ios/NotificationServiceExtension/ExpError.swift index 7760be640936..147618fb26d9 100644 --- a/ios/CustomNotificationServiceExtension/ExpError.swift +++ b/ios/NotificationServiceExtension/ExpError.swift @@ -1,6 +1,6 @@ // // ExpError.swift -// CustomNotificationServiceExtension +// NotificationServiceExtension // // Created by Andrew Rosiclair on 12/13/23. // diff --git a/ios/CustomNotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist similarity index 100% rename from ios/CustomNotificationServiceExtension/Info.plist rename to ios/NotificationServiceExtension/Info.plist diff --git a/ios/CustomNotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift similarity index 98% rename from ios/CustomNotificationServiceExtension/NotificationService.swift rename to ios/NotificationServiceExtension/NotificationService.swift index 508d47799d34..a658a16a9945 100644 --- a/ios/CustomNotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -1,6 +1,6 @@ // // NotificationService.swift -// CustomNotificationServiceExtension +// NotificationServiceExtension // // Created by Andrew Rosiclair on 12/8/23. // @@ -13,7 +13,7 @@ class NotificationService: UANotificationServiceExtension { var contentHandler: ((UNNotificationContent) -> Void)? var bestAttemptContent: UNMutableNotificationContent? - let log = OSLog(subsystem: Bundle.main.bundleIdentifier ?? "com.expensify.chat.dev.CustomNotificationServiceExtension", category: "NotificationService") + let log = OSLog(subsystem: Bundle.main.bundleIdentifier ?? "com.expensify.chat.dev.NotificationServiceExtension", category: "NotificationService") override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { os_log("[NotificationService] didReceive() - received notification", log: log) diff --git a/ios/Podfile b/ios/Podfile index 2df3d94a013d..0c081fa92487 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -119,6 +119,6 @@ target 'NewExpensify' do end end -target 'CustomNotificationServiceExtension' do +target 'NotificationServiceExtension' do pod 'AirshipServiceExtension' end diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 0c1214344a8f..3d5b685975ab 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1295,6 +1295,6 @@ SPEC CHECKSUMS: Yoga: 3efc43e0d48686ce2e8c60f99d4e6bd349aff981 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: c44319b85c142746fd25749dc13f06ce81273f22 +PODFILE CHECKSUM: 39399f883f6ae62edb4cc9e4fab8d4143eab59a7 COCOAPODS: 1.12.1 From 67d8610e879ca8ab7dc833fa0a4179d7908b5344 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 14:54:24 -0500 Subject: [PATCH 25/55] fix pod install warnings for overriden settings --- ios/NewExpensify.xcodeproj/project.pbxproj | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index fa5384a9944f..9aba960a0881 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -827,7 +827,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 4E8BF7B08BA3181991BFCF4B /* Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; @@ -850,7 +849,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 0B627F2A465153FFA6E3A4E0 /* Pods-NewExpensify.debugdevelopment.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -883,7 +881,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -937,7 +934,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1018,7 +1014,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1098,7 +1093,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1178,7 +1172,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1251,7 +1244,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1324,7 +1316,6 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1563,7 +1554,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = CE2F84BEE9A6DCC228AF7E42 /* Pods-NewExpensify.debugproduction.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1686,7 +1676,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 6F6A514B4DF07A60EC8355BA /* Pods-NewExpensify.debugadhoc.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconAdHoc; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1803,7 +1792,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 47D5DF3C6779D41BE70CD031 /* Pods-NewExpensify.releaseproduction.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; @@ -1916,7 +1904,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIconAdHoc; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; From 2fe775f863dcb20b61bd73312af3195c032c4ebc Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 15:24:06 -0500 Subject: [PATCH 26/55] configure the group/room name --- .../NotificationService.swift | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/ios/NotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift index a658a16a9945..943a8f89cf42 100644 --- a/ios/NotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -150,24 +150,43 @@ class NotificationService: UANotificationServiceExtension { let avatar = fetchINImage(imageURL: notificationData.avatarURL, reportActionID: notificationData.reportActionID) let sender = INPerson(personHandle: handle, nameComponents: nil, - displayName: notificationData.title, + displayName: notificationData.userName, image: avatar, contactIdentifier: nil, customIdentifier: nil) - + + // Configure the group/room name if there is one + var speakableGroupName: INSpeakableString? = nil + var recipients: [INPerson]? = nil + if (notificationData.roomName != nil) { + speakableGroupName = INSpeakableString(spokenPhrase: notificationData.roomName ?? "") + + // To add the group name subtitle there must be multiple recipients set. However, we do not have + // data on the participatns in the room/group chat so we just add a placeholder here. This shouldn't + // appear anywhere in the UI + let placeholderPerson = INPerson(personHandle: INPersonHandle(value: "placeholder", type: .unknown), + nameComponents: nil, + displayName: "placeholder", + image: nil, + contactIdentifier: nil, + customIdentifier: nil) + recipients = [sender, placeholderPerson] + } // Because this communication is incoming, you can infer that the current user is // a recipient. Don't include the current user when initializing the intent. - let roomName = INSpeakableString(spokenPhrase: notificationData.roomName ?? "") - let intent = INSendMessageIntent(recipients: nil, + let intent = INSendMessageIntent(recipients: recipients, outgoingMessageType: .outgoingMessageText, content: notificationData.messageText, - speakableGroupName: roomName, + speakableGroupName: speakableGroupName, conversationIdentifier: String(notificationData.reportID), serviceName: nil, sender: sender, attachments: nil) + // When the group name is set, we force the avatar to just be the sender's avatar + intent.setImage(avatar, forParameterNamed: \.speakableGroupName) + return intent } From e5b8b3f8e433918e8d6d60ed87f1aae8765a52f1 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 16:51:21 -0500 Subject: [PATCH 27/55] update bundle IDs for adhoc and prod --- ios/NewExpensify.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 9aba960a0881..da9be3466ef4 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -1054,7 +1054,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1133,7 +1133,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1277,7 +1277,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1349,7 +1349,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; From 055e64c39e35cd9be1327a613365ea660ea9224e Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 16:52:07 -0500 Subject: [PATCH 28/55] use manual signing to match the main app target --- ios/NewExpensify.xcodeproj/project.pbxproj | 32 ++++++++++++---------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index da9be3466ef4..4e3a0745bf73 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -420,8 +420,7 @@ }; 7FD73C9A2B23CE9500420AF3 = { CreatedOnToolsVersion = 15.0.1; - DevelopmentTeam = 368M544MTT; - ProvisioningStyle = Automatic; + ProvisioningStyle = Manual; }; }; }; @@ -941,11 +940,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1021,11 +1020,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1056,6 +1055,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1100,11 +1100,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1135,6 +1135,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1179,11 +1180,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1207,6 +1208,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; @@ -1251,11 +1253,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1279,6 +1281,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; @@ -1323,11 +1326,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = 368M544MTT; + DEVELOPMENT_TEAM = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1351,6 +1354,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; From fd11e2d3af6d8f0a1311bebaf006de86d1f41b18 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Sun, 17 Dec 2023 17:17:32 -0500 Subject: [PATCH 29/55] podfile lock update --- ios/Podfile.lock | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 797d341020b9..3d5b685975ab 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -778,10 +778,35 @@ PODS: - React-Core - RNReactNativeHapticFeedback (1.14.0): - React-Core - - RNReanimated (3.6.1): - - RCT-Folly (= 2021.07.22.00) + - RNReanimated (3.5.4): + - DoubleConversion + - FBLazyVector + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-callinvoker - React-Core + - React-Core/DevSupport + - React-Core/RCTWebSocket + - React-CoreModules + - React-cxxreact + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-RCTActionSheet + - React-RCTAnimation + - React-RCTAppDelegate + - React-RCTBlob + - React-RCTImage + - React-RCTLinking + - React-RCTNetwork + - React-RCTSettings + - React-RCTText - ReactCommon/turbomodule/core + - Yoga - RNScreens (3.21.0): - React-Core - React-RCTImage @@ -1259,7 +1284,7 @@ SPEC CHECKSUMS: rnmapbox-maps: 6f638ec002aa6e906a6f766d69cd45f968d98e64 RNPermissions: 9b086c8f05b2e2faa587fdc31f4c5ab4509728aa RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c - RNReanimated: fdbaa9c964bbab7fac50c90862b6cc5f041679b9 + RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87 RNScreens: d037903436160a4b039d32606668350d2a808806 RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d From fba84c4b196ff5667b339d0a1db9d92d029806f8 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Tue, 19 Dec 2023 18:04:45 +0500 Subject: [PATCH 30/55] fix: use navigation from prop to support reassure testing --- src/components/ScreenWrapper/index.js | 9 +++++++-- src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx | 5 ++++- src/pages/home/ReportScreen.js | 2 ++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/components/ScreenWrapper/index.js b/src/components/ScreenWrapper/index.js index bd277ffa1ab8..f66fe2ab0c8d 100644 --- a/src/components/ScreenWrapper/index.js +++ b/src/components/ScreenWrapper/index.js @@ -1,4 +1,3 @@ -import {useNavigation} from '@react-navigation/native'; import lodashGet from 'lodash/get'; import React, {useEffect, useRef, useState} from 'react'; import {Keyboard, PanResponder, View} from 'react-native'; @@ -39,6 +38,13 @@ const ScreenWrapper = React.forwardRef( shouldDismissKeyboardBeforeClose, onEntryTransitionEnd, testID, + /** + * The navigation prop is passed by the navigator. It is used to trigger the onEntryTransitionEnd callback + * when the screen transition ends. + * + * This is required because transitionEnd event doesn't trigger in the testing environment. + */ + navigation, }, ref, ) => { @@ -48,7 +54,6 @@ const ScreenWrapper = React.forwardRef( const keyboardState = useKeyboardState(); const {isDevelopment} = useEnvironment(); const {isOffline} = useNetwork(); - const navigation = useNavigation(); const [didScreenTransitionEnd, setDidScreenTransitionEnd] = useState(false); const maxHeight = shouldEnableMaxHeight ? windowHeight : undefined; const minHeight = shouldEnableMinHeight && !Browser.isSafari() ? initialHeight : undefined; diff --git a/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx b/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx index 20922fd785ce..c137af4485e3 100644 --- a/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx +++ b/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx @@ -13,7 +13,10 @@ function ReportScreenWrapper({route, navigation}: ReportScreenWrapperProps) { return ( <> {/* @ts-expect-error Error will be resolved after ReportScreen migration to TypeScript */} - + Date: Tue, 19 Dec 2023 18:05:23 +0500 Subject: [PATCH 31/55] test: add support for transitionEnd event for reassure --- tests/perf-test/ReportScreen.perf-test.js | 69 ++++++++++++++++++++++- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 96514112cd05..3be414c148c2 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -1,4 +1,4 @@ -import {fireEvent, screen} from '@testing-library/react-native'; +import {act, fireEvent, screen} from '@testing-library/react-native'; import React from 'react'; import Onyx from 'react-native-onyx'; import {measurePerformance} from 'reassure'; @@ -101,6 +101,34 @@ afterEach(() => { PusherHelper.teardown(); }); +/** + * This is a helper function to create a mock for the addListener function of the react-navigation library. + * The reason we need this is because we need to trigger the transitionEnd event in our tests to simulate + * the transitionEnd event that is triggered when the screen transition animation is completed. + * + * P.S: This can't be moved to a utils file because Jest wants any external function to stay in the scope. + * + * @returns {Object} An object with two functions: triggerTransitionEnd and addListener + */ +const createAddListenerMock = () => { + const transitionEndListeners = []; + const triggerTransitionEnd = () => { + transitionEndListeners.forEach((transitionEndListener) => transitionEndListener()); + }; + + const addListener = jest.fn().mockImplementation((listener, callback) => { + if (listener === 'transitionEnd') { + transitionEndListeners.push(callback); + } + return () => { + // eslint-disable-next-line rulesdir/prefer-underscore-method + transitionEndListeners.filter((cb) => cb !== callback); + }; + }); + + return {triggerTransitionEnd, addListener}; +}; + function ReportScreenWrapper(args) { return ( ); @@ -125,7 +154,12 @@ function ReportScreenWrapper(args) { const runs = CONST.PERFORMANCE_TESTS.RUNS; test('[ReportScreen] should render ReportScreen with composer interactions', () => { + const {triggerTransitionEnd, addListener} = createAddListenerMock(); const scenario = async () => { + await screen.findByTestId('ReportScreen'); + + await act(triggerTransitionEnd); + // Query for the report list await screen.findByTestId('report-actions-list'); @@ -158,6 +192,10 @@ test('[ReportScreen] should render ReportScreen with composer interactions', () const reportActions = ReportTestUtils.getMockedReportActionsMap(1000); const mockRoute = {params: {reportID: '1'}}; + const navigation = { + addListener, + }; + return waitForBatchedUpdates() .then(() => Onyx.multiSet({ @@ -172,11 +210,24 @@ test('[ReportScreen] should render ReportScreen with composer interactions', () }, }), ) - .then(() => measurePerformance(, {scenario, runs})); + .then(() => + measurePerformance( + , + {scenario, runs}, + ), + ); }); test('[ReportScreen] should press of the report item', () => { + const {triggerTransitionEnd, addListener} = createAddListenerMock(); const scenario = async () => { + await screen.findByTestId('ReportScreen'); + + await act(triggerTransitionEnd); + // Query for the report list await screen.findByTestId('report-actions-list'); @@ -201,6 +252,10 @@ test('[ReportScreen] should press of the report item', () => { const reportActions = ReportTestUtils.getMockedReportActionsMap(1000); const mockRoute = {params: {reportID: '2'}}; + const navigation = { + addListener, + }; + return waitForBatchedUpdates() .then(() => Onyx.multiSet({ @@ -215,5 +270,13 @@ test('[ReportScreen] should press of the report item', () => { }, }), ) - .then(() => measurePerformance(, {scenario, runs})); + .then(() => + measurePerformance( + , + {scenario, runs}, + ), + ); }); From 506ac9ef14b64ed97c9c9fe40ea842e7a8bc90f2 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 10:32:40 -0500 Subject: [PATCH 32/55] use iphone distribution like the main target --- ios/NewExpensify.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 4e3a0745bf73..9ab84aa8dd65 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -939,7 +939,7 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; From a7ca53fe9ccfe55442ad83013d532a2572f6226d Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 11:20:57 -0500 Subject: [PATCH 33/55] podfile update --- ios/Podfile.lock | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3d5b685975ab..797d341020b9 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -778,35 +778,10 @@ PODS: - React-Core - RNReactNativeHapticFeedback (1.14.0): - React-Core - - RNReanimated (3.5.4): - - DoubleConversion - - FBLazyVector - - glog - - hermes-engine - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React-callinvoker + - RNReanimated (3.6.1): + - RCT-Folly (= 2021.07.22.00) - React-Core - - React-Core/DevSupport - - React-Core/RCTWebSocket - - React-CoreModules - - React-cxxreact - - React-hermes - - React-jsi - - React-jsiexecutor - - React-jsinspector - - React-RCTActionSheet - - React-RCTAnimation - - React-RCTAppDelegate - - React-RCTBlob - - React-RCTImage - - React-RCTLinking - - React-RCTNetwork - - React-RCTSettings - - React-RCTText - ReactCommon/turbomodule/core - - Yoga - RNScreens (3.21.0): - React-Core - React-RCTImage @@ -1284,7 +1259,7 @@ SPEC CHECKSUMS: rnmapbox-maps: 6f638ec002aa6e906a6f766d69cd45f968d98e64 RNPermissions: 9b086c8f05b2e2faa587fdc31f4c5ab4509728aa RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c - RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87 + RNReanimated: fdbaa9c964bbab7fac50c90862b6cc5f041679b9 RNScreens: d037903436160a4b039d32606668350d2a808806 RNSVG: d00c8f91c3cbf6d476451313a18f04d220d4f396 SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d From f7343106bcdd6610713427b643f16bb972610a2d Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 11:25:30 -0500 Subject: [PATCH 34/55] comment pointing to docs for comms notifications --- ios/NotificationServiceExtension/NotificationService.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ios/NotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift index 943a8f89cf42..a749c25431d6 100644 --- a/ios/NotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -31,6 +31,9 @@ class NotificationService: UANotificationServiceExtension { } } + /** + * Parses the notification content and modifies it to be a Communication Notification. More info here: https://developer.apple.com/documentation/usernotifications/implementing_communication_notifications + */ @available(iOSApplicationExtension 15.0, *) func configureCommunicationNotification(notificationContent: UNMutableNotificationContent, contentHandler: @escaping (UNNotificationContent) -> Void) { var notificationData: NotificationData From 9115cc82d96a3567a3a0ff6d2610e43c3f21d4b3 Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 19 Dec 2023 12:31:39 -0700 Subject: [PATCH 35/55] Update provisioning profiles in xcode project --- ios/NewExpensify.xcodeproj/project.pbxproj | 35 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 9ab84aa8dd65..37dfdd53f25f 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -420,6 +420,7 @@ }; 7FD73C9A2B23CE9500420AF3 = { CreatedOnToolsVersion = 15.0.1; + DevelopmentTeam = 368M544MTT; ProvisioningStyle = Manual; }; }; @@ -853,9 +854,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = NewExpensify/Chat.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/NewExpensify/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -869,6 +872,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev; PRODUCT_NAME = "New Expensify Dev"; PROVISIONING_PROFILE_SPECIFIER = expensify_chat_dev; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -885,9 +889,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = NewExpensify/Chat.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; INFOPLIST_FILE = NewExpensify/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -900,6 +906,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev; PRODUCT_NAME = "New Expensify Dev"; PROVISIONING_PROFILE_SPECIFIER = expensify_chat_dev; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -940,11 +947,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -973,9 +982,10 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1025,6 +1035,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1056,6 +1067,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1100,11 +1112,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1136,6 +1150,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; @@ -1180,11 +1195,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1206,9 +1223,10 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; @@ -1258,6 +1276,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1282,6 +1301,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; @@ -1326,11 +1346,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -1355,6 +1377,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AppStore: Notification Service"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_COMPILATION_MODE = wholemodule; @@ -1566,6 +1589,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/NewExpensify/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -1579,6 +1603,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; PRODUCT_NAME = "New Expensify"; PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AppStore"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1688,6 +1713,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/NewExpensify/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -1701,6 +1727,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc; PRODUCT_NAME = "New Expensify AdHoc"; PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1804,6 +1831,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; INFOPLIST_FILE = NewExpensify/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1816,6 +1844,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; PRODUCT_NAME = "New Expensify"; PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AppStore"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -1916,6 +1945,7 @@ CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = 368M544MTT; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 368M544MTT; INFOPLIST_FILE = NewExpensify/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -1928,6 +1958,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc; PRODUCT_NAME = "New Expensify AdHoc"; PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; From 44d09e58e73e937ad60e1c26107bfc022f5e4674 Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 19 Dec 2023 12:50:55 -0700 Subject: [PATCH 36/55] Update with new profiles for Notification Service --- .github/scripts/verifyPodfile.sh | 2 +- .github/workflows/README.md | 6 ++++-- .github/workflows/platformDeploy.yml | 11 +++++++--- .github/workflows/testBuild.yml | 9 ++++++-- fastlane/Fastfile | 20 ++++++++++++++---- ios/NewApp_AdHoc.mobileprovision.gpg | Bin 0 -> 11311 bytes ...c_Notification_Service.mobileprovision.gpg | Bin 0 -> 10923 bytes ios/NewApp_AppStore.mobileprovision.gpg | Bin 0 -> 8230 bytes ...e_Notification_Service.mobileprovision.gpg | Bin 0 -> 7823 bytes ...hat_expensify_appstore.mobileprovision.gpg | Bin 8171 -> 0 bytes ios/expensify_chat_adhoc.mobileprovision.gpg | Bin 11262 -> 0 bytes 11 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 ios/NewApp_AdHoc.mobileprovision.gpg create mode 100644 ios/NewApp_AdHoc_Notification_Service.mobileprovision.gpg create mode 100644 ios/NewApp_AppStore.mobileprovision.gpg create mode 100644 ios/NewApp_AppStore_Notification_Service.mobileprovision.gpg delete mode 100644 ios/chat_expensify_appstore.mobileprovision.gpg delete mode 100644 ios/expensify_chat_adhoc.mobileprovision.gpg diff --git a/.github/scripts/verifyPodfile.sh b/.github/scripts/verifyPodfile.sh index ec2709a25786..914681f46ec0 100755 --- a/.github/scripts/verifyPodfile.sh +++ b/.github/scripts/verifyPodfile.sh @@ -12,7 +12,7 @@ declare EXIT_CODE=0 # Check Provisioning Style. If automatic signing is enabled, iOS builds will fail, so ensure we always have the proper profile specified info "Verifying that automatic signing is not enabled" -if grep -q 'PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore' ios/NewExpensify.xcodeproj/project.pbxproj; then +if grep -q 'PROVISIONING_PROFILE_SPECIFIER = NewApp_AppStore' ios/NewExpensify.xcodeproj/project.pbxproj; then success "Automatic signing not enabled" else error "Error: Automatic provisioning style is not allowed!" diff --git a/.github/workflows/README.md b/.github/workflows/README.md index d940d99d9cde..b2cc58fa4a6a 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -83,8 +83,10 @@ The GitHub workflows require a large list of secrets to deploy, notify and test 1. `LARGE_SECRET_PASSPHRASE` - decrypts secrets stored in various encrypted files stored in GitHub repository. To create updated versions of these encrypted files, refer to steps 1-4 of [this encrypted secrets help page](https://docs.github.com/en/actions/reference/encrypted-secrets#limits-for-secrets) using the `LARGE_SECRET_PASSPHRASE`. 1. `android/app/my-upload-key.keystore.gpg` 1. `android/app/android-fastlane-json-key.json.gpg` - 1. `ios/expensify_chat_adhoc.mobileprovision.gpg` - 1. `ios/chat_expensify_appstore.mobileprovision.gpg` + 1. `ios/NewApp_AdHoc.mobileprovision` + 1. `ios/NewApp_AdHoc_Notification_Service.mobileprovision` + 1. `ios/NewApp_AppStore.mobileprovision.gpg` + 1. `ios/NewApp_AppStore_Notification_Service.mobileprovision.gpg` 1. `ios/Certificates.p12.gpg` 1. `SLACK_WEBHOOK` - Sends Slack notifications via Slack WebHook https://expensify.slack.com/services/B01AX48D7MM 1. `OS_BOTIFY_TOKEN` - Personal access token for @OSBotify user in GitHub diff --git a/.github/workflows/platformDeploy.yml b/.github/workflows/platformDeploy.yml index 8ccc0a7f6056..f1cf0d64f834 100644 --- a/.github/workflows/platformDeploy.yml +++ b/.github/workflows/platformDeploy.yml @@ -61,7 +61,7 @@ jobs: with: distribution: 'oracle' java-version: '17' - + - name: Setup Ruby uses: ruby/setup-ruby@a05e47355e80e57b9a67566a813648fa67d92011 with: @@ -211,8 +211,13 @@ jobs: max_attempts: 5 command: cd ios && bundle exec pod install - - name: Decrypt profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output chat_expensify_appstore.mobileprovision chat_expensify_appstore.mobileprovision.gpg + - name: Decrypt AppStore profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore.mobileprovision NewApp_AppStore.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt AppStore Notification Service profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AppStore_Notification_Service.mobileprovision NewApp_AppStore_Notification_Service.mobileprovision.gpg env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index 94a51a2d11bd..eecce6b9060a 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -186,8 +186,13 @@ jobs: max_attempts: 5 command: cd ios && bundle exec pod install - - name: Decrypt profile - run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output expensify_chat_adhoc.mobileprovision expensify_chat_adhoc.mobileprovision.gpg + - name: Decrypt AdHoc profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc.mobileprovision NewApp_AdHoc.mobileprovision.gpg + env: + LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} + + - name: Decrypt AdHoc Notification Service profile + run: cd ios && gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" --output NewApp_AdHoc_Notification_Service.mobileprovision NewApp_AdHoc_Notification_Service.mobileprovision.gpg env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 2b5c15146eb3..7fb67f073c6f 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -161,19 +161,27 @@ platform :ios do ) install_provisioning_profile( - path: "./ios/expensify_chat_adhoc.mobileprovision" + path: "./ios/NewApp_AdHoc.mobileprovision" + ) + + install_provisioning_profile( + path: "./ios/NewApp_AdHoc_Notification_Service.mobileprovision" ) build_app( workspace: "./ios/NewExpensify.xcworkspace", skip_profile_detection: true, scheme: "New Expensify AdHoc", - xcargs: { :PROVISIONING_PROFILE_SPECIFIER => "expensify_chat_adhoc", }, + xcargs: { + :PROVISIONING_PROFILE_SPECIFIER => "NewApp_AdHoc", + :PROVISIONING_PROFILE_SPECIFIER => "NewApp_AdHoc_Notification_Service", + }, export_method: "ad-hoc", export_options: { method: "ad-hoc", provisioningProfiles: { - "com.expensify.chat.adhoc" => "expensify_chat_adhoc", + "com.expensify.chat.adhoc" => "NewApp_AdHoc", + "com.expensify.chat.adhoc.NotificationServiceExtension" => "NewApp_AdHoc_Notification_Service", }, manageAppVersionAndBuildNumber: false } @@ -215,7 +223,11 @@ platform :ios do ) install_provisioning_profile( - path: "./ios/chat_expensify_appstore.mobileprovision" + path: "./ios/NewApp_AppStore.mobileprovision" + ) + + install_provisioning_profile( + path: "./ios/NewApp_AppStore_Notification_Service.mobileprovision" ) build_app( diff --git a/ios/NewApp_AdHoc.mobileprovision.gpg b/ios/NewApp_AdHoc.mobileprovision.gpg new file mode 100644 index 0000000000000000000000000000000000000000..e5ee52210866c18e6ba1683147be3299658ddb2e GIT binary patch literal 11311 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 Y6n6^8)+QTe?@L)$<@Gf;L;BCD8;I393jhEB literal 0 HcmV?d00001 diff --git a/ios/NewApp_AppStore_Notification_Service.mobileprovision.gpg b/ios/NewApp_AppStore_Notification_Service.mobileprovision.gpg new file mode 100644 index 0000000000000000000000000000000000000000..4af7b16c50413480412bb185a868782a24dc6684 GIT binary patch literal 7823 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 literal 0 HcmV?d00001 diff --git a/ios/chat_expensify_appstore.mobileprovision.gpg b/ios/chat_expensify_appstore.mobileprovision.gpg deleted file mode 100644 index 246f5f0ec99e6e67c58f131414b7d06bfb6b0d83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8171 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 R&LWkJQNyh%4o1k;tSxGu_)h=; diff --git a/ios/expensify_chat_adhoc.mobileprovision.gpg b/ios/expensify_chat_adhoc.mobileprovision.gpg deleted file mode 100644 index f4691df10d67d8234b7a54b75e74c34dae9be396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11262 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 From ae48bdcd88c6a831ecc20de84633ccf769b6cecd Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 14:56:48 -0500 Subject: [PATCH 37/55] comment updates Co-authored-by: Manan --- ios/NotificationServiceExtension/NotificationService.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/NotificationServiceExtension/NotificationService.swift b/ios/NotificationServiceExtension/NotificationService.swift index a749c25431d6..c4eb01981bf2 100644 --- a/ios/NotificationServiceExtension/NotificationService.swift +++ b/ios/NotificationServiceExtension/NotificationService.swift @@ -49,7 +49,7 @@ class NotificationService: UANotificationServiceExtension { return } - // Create an intent for the incoming message + // Create an intent for the incoming communication message let intent: INSendMessageIntent = createMessageIntent(notificationData: notificationData) // Use the intent to initialize the interaction. @@ -187,7 +187,7 @@ class NotificationService: UANotificationServiceExtension { sender: sender, attachments: nil) - // When the group name is set, we force the avatar to just be the sender's avatar + // If the group name is set, we force the avatar to just be the sender's avatar intent.setImage(avatar, forParameterNamed: \.speakableGroupName) return intent From 13beb5f08824b8ee5679501895c1c44f84490990 Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 19 Dec 2023 13:03:20 -0700 Subject: [PATCH 38/55] Tweaking configs for test and AdHoc --- .github/scripts/verifyPodfile.sh | 2 +- fastlane/Fastfile | 4 ++-- ios/NewExpensify.xcodeproj/project.pbxproj | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/scripts/verifyPodfile.sh b/.github/scripts/verifyPodfile.sh index 914681f46ec0..ab807aaf919c 100755 --- a/.github/scripts/verifyPodfile.sh +++ b/.github/scripts/verifyPodfile.sh @@ -12,7 +12,7 @@ declare EXIT_CODE=0 # Check Provisioning Style. If automatic signing is enabled, iOS builds will fail, so ensure we always have the proper profile specified info "Verifying that automatic signing is not enabled" -if grep -q 'PROVISIONING_PROFILE_SPECIFIER = NewApp_AppStore' ios/NewExpensify.xcodeproj/project.pbxproj; then +if grep -q 'PROVISIONING_PROFILE_SPECIFIER = (NewApp) AppStore' ios/NewExpensify.xcodeproj/project.pbxproj; then success "Automatic signing not enabled" else error "Error: Automatic provisioning style is not allowed!" diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 7fb67f073c6f..2e4a7f1ea9c7 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -173,8 +173,8 @@ platform :ios do skip_profile_detection: true, scheme: "New Expensify AdHoc", xcargs: { - :PROVISIONING_PROFILE_SPECIFIER => "NewApp_AdHoc", - :PROVISIONING_PROFILE_SPECIFIER => "NewApp_AdHoc_Notification_Service", + :PROVISIONING_PROFILE_SPECIFIER => "(NewApp) AdHoc", + :PROVISIONING_PROFILE_SPECIFIER => "(NewApp) AdHoc: Notification Service", }, export_method: "ad-hoc", export_options: { diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index 37dfdd53f25f..fde2c8c17d15 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -871,7 +871,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev; PRODUCT_NAME = "New Expensify Dev"; - PROVISIONING_PROFILE_SPECIFIER = expensify_chat_dev; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) Development"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -905,7 +905,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev; PRODUCT_NAME = "New Expensify Dev"; - PROVISIONING_PROFILE_SPECIFIER = expensify_chat_dev; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) Development"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1602,7 +1602,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; PRODUCT_NAME = "New Expensify"; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AppStore"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AppStore"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1726,7 +1726,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc; PRODUCT_NAME = "New Expensify AdHoc"; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AdHoc"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1843,7 +1843,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat; PRODUCT_NAME = "New Expensify"; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AppStore"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AppStore"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1957,7 +1957,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc; PRODUCT_NAME = "New Expensify AdHoc"; - PROVISIONING_PROFILE_SPECIFIER = chat_expensify_appstore; + PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AdHoc"; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) AdHoc"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; From c39c67eb6d5a72163f7ddcf6a256aa48e8609806 Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 19 Dec 2023 13:22:34 -0700 Subject: [PATCH 39/55] Tweak provisioning profile config --- fastlane/Fastfile | 1 - 1 file changed, 1 deletion(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 2e4a7f1ea9c7..931119b7cf4b 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -174,7 +174,6 @@ platform :ios do scheme: "New Expensify AdHoc", xcargs: { :PROVISIONING_PROFILE_SPECIFIER => "(NewApp) AdHoc", - :PROVISIONING_PROFILE_SPECIFIER => "(NewApp) AdHoc: Notification Service", }, export_method: "ad-hoc", export_options: { From 77079113dfed64302f3ec99cdb584a210ce5b48a Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 16:18:21 -0500 Subject: [PATCH 40/55] remove xcargs override --- fastlane/Fastfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 931119b7cf4b..51ac3af96f18 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -172,9 +172,6 @@ platform :ios do workspace: "./ios/NewExpensify.xcworkspace", skip_profile_detection: true, scheme: "New Expensify AdHoc", - xcargs: { - :PROVISIONING_PROFILE_SPECIFIER => "(NewApp) AdHoc", - }, export_method: "ad-hoc", export_options: { method: "ad-hoc", From 2b451b2944428f6344187eeac49a830937100adc Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 16:40:46 -0500 Subject: [PATCH 41/55] use new profile names --- fastlane/Fastfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 51ac3af96f18..b30231f80119 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -176,8 +176,8 @@ platform :ios do export_options: { method: "ad-hoc", provisioningProfiles: { - "com.expensify.chat.adhoc" => "NewApp_AdHoc", - "com.expensify.chat.adhoc.NotificationServiceExtension" => "NewApp_AdHoc_Notification_Service", + "com.expensify.chat.adhoc" => "(NewApp) AdHoc", + "com.expensify.chat.adhoc.NotificationServiceExtension" => "(NewApp) AdHoc: Notification Service", }, manageAppVersionAndBuildNumber: false } From 73a37f17e3a4fe0c474e70a0c6ac7e0386848de2 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 17:29:10 -0500 Subject: [PATCH 42/55] set provisioning profiles for AppStore build --- fastlane/Fastfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index b30231f80119..b7d3334c902f 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -231,6 +231,10 @@ platform :ios do scheme: "New Expensify", output_name: "New Expensify.ipa", export_options: { + provisioningProfiles: { + "com.chat.expensify.chat" => "(NewApp) AppStore", + "com.chat.expensify.chat.NotificationServiceExtension" => "(NewApp) AppStore: Notification Service", + }, manageAppVersionAndBuildNumber: false } ) From d09f9d75399d3f71b6fb7b23ead122f043b544b6 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 19 Dec 2023 17:46:42 -0500 Subject: [PATCH 43/55] fix grep check --- .github/scripts/verifyPodfile.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/verifyPodfile.sh b/.github/scripts/verifyPodfile.sh index ab807aaf919c..cd94a49bb091 100755 --- a/.github/scripts/verifyPodfile.sh +++ b/.github/scripts/verifyPodfile.sh @@ -12,7 +12,7 @@ declare EXIT_CODE=0 # Check Provisioning Style. If automatic signing is enabled, iOS builds will fail, so ensure we always have the proper profile specified info "Verifying that automatic signing is not enabled" -if grep -q 'PROVISIONING_PROFILE_SPECIFIER = (NewApp) AppStore' ios/NewExpensify.xcodeproj/project.pbxproj; then +if grep -q 'PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AppStore"' ios/NewExpensify.xcodeproj/project.pbxproj; then success "Automatic signing not enabled" else error "Error: Automatic provisioning style is not allowed!" From e0e06a70de459009999076bf3805ded7a1deb997 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Wed, 20 Dec 2023 13:04:17 +0500 Subject: [PATCH 44/55] fix: typecheck --- src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx b/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx index c137af4485e3..f3295aadb888 100644 --- a/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx +++ b/src/libs/Navigation/AppNavigator/ReportScreenWrapper.tsx @@ -12,8 +12,8 @@ function ReportScreenWrapper({route, navigation}: ReportScreenWrapperProps) { // until the reportID is loaded and set in the route param return ( <> - {/* @ts-expect-error Error will be resolved after ReportScreen migration to TypeScript */} From 5b824fb0d3ffffcc00ab09cfd9ff0f5e4ce69965 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Wed, 20 Dec 2023 14:01:48 +0500 Subject: [PATCH 45/55] fix: fallback to useNavigation --- src/components/ScreenWrapper/index.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/ScreenWrapper/index.js b/src/components/ScreenWrapper/index.js index f66fe2ab0c8d..5605689e2702 100644 --- a/src/components/ScreenWrapper/index.js +++ b/src/components/ScreenWrapper/index.js @@ -1,3 +1,4 @@ +import {useNavigation} from '@react-navigation/native'; import lodashGet from 'lodash/get'; import React, {useEffect, useRef, useState} from 'react'; import {Keyboard, PanResponder, View} from 'react-native'; @@ -44,10 +45,19 @@ const ScreenWrapper = React.forwardRef( * * This is required because transitionEnd event doesn't trigger in the testing environment. */ - navigation, + navigation: navigationProp, }, ref, ) => { + /** + * We are only passing navigation as prop from + * ReportScreenWrapper -> ReportScreen -> ScreenWrapper + * + * so in other places where ScreenWrapper is used, we need to + * fallback to useNavigation. + */ + const navigationFallback = useNavigation(); + const navigation = navigationProp || navigationFallback; const {windowHeight, isSmallScreenWidth} = useWindowDimensions(); const {initialHeight} = useInitialDimensions(); const styles = useThemeStyles(); From 9788965c9ddd912dbd2978180b17a464ffe3a055 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Wed, 20 Dec 2023 15:53:16 -0500 Subject: [PATCH 46/55] rename mock steps and assertions --- .../assertions/platformDeployAssertions.js | 3 ++- workflow_tests/assertions/testBuildAssertions.js | 11 ++++++++++- workflow_tests/mocks/platformDeployMocks.js | 8 ++++++-- workflow_tests/mocks/testBuildMocks.js | 12 ++++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/workflow_tests/assertions/platformDeployAssertions.js b/workflow_tests/assertions/platformDeployAssertions.js index 458899581687..e7e14578c3a2 100644 --- a/workflow_tests/assertions/platformDeployAssertions.js +++ b/workflow_tests/assertions/platformDeployAssertions.js @@ -170,7 +170,8 @@ const assertIOSJobExecuted = (workflowResult, didExecute = true, isProduction = {key: 'max_attempts', value: '5'}, {key: 'command', value: 'cd ios && bundle exec pod install'}, ]), - utils.createStepAssertion('Decrypt profile', true, null, 'IOS', 'Decrypting profile', null, [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), + utils.createStepAssertion('Decrypt AppStore profile', true, null, 'IOS', 'Decrypting profile', null, [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), + utils.createStepAssertion('Decrypt AppStore Notification Service profile', true, null, 'IOS', 'Decrypting profile', null, [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), utils.createStepAssertion('Decrypt certificate', true, null, 'IOS', 'Decrypting certificate', null, [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), utils.createStepAssertion('Decrypt App Store Connect API key', true, null, 'IOS', 'Decrypting App Store API key', null, [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), ]; diff --git a/workflow_tests/assertions/testBuildAssertions.js b/workflow_tests/assertions/testBuildAssertions.js index 781e6bac20a2..f26380616c47 100644 --- a/workflow_tests/assertions/testBuildAssertions.js +++ b/workflow_tests/assertions/testBuildAssertions.js @@ -185,7 +185,16 @@ const assertIOSJobExecuted = (workflowResult, ref = '', didExecute = true, fails ], [], ), - utils.createStepAssertion('Decrypt profile', true, null, 'IOS', 'Decrypt profile', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), + utils.createStepAssertion('Decrypt AppStore profile', true, null, 'IOS', 'Decrypt AppStore profile', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), + utils.createStepAssertion( + 'Decrypt AppStore Notification Service profile', + true, + null, + 'IOS', + 'Decrypt AppStore Notification Service profile', + [], + [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}], + ), utils.createStepAssertion('Decrypt certificate', true, null, 'IOS', 'Decrypt certificate', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), utils.createStepAssertion( 'Configure AWS Credentials', diff --git a/workflow_tests/mocks/platformDeployMocks.js b/workflow_tests/mocks/platformDeployMocks.js index 0d75a5fd74ee..a2bf78d6a8ab 100644 --- a/workflow_tests/mocks/platformDeployMocks.js +++ b/workflow_tests/mocks/platformDeployMocks.js @@ -123,7 +123,10 @@ const PLATFORM_DEPLOY__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK = utils.crea {IS_PODFILE_SAME_AS_MANIFEST: false}, ); const PLATFORM_DEPLOY__IOS__COCOAPODS__STEP_MOCK = utils.createMockStep('Install cocoapods', 'Installing cocoapods', 'IOS', ['timeout_minutes', 'max_attempts', 'command']); -const PLATFORM_DEPLOY__IOS__DECRYPT_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt profile', 'Decrypting profile', 'IOS', null, ['LARGE_SECRET_PASSPHRASE']); +const PLATFORM_DEPLOY__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt AppStore profile', 'Decrypting profile', 'IOS', null, ['LARGE_SECRET_PASSPHRASE']); +const PLATFORM_DEPLOY__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt AppStore Notification Service profile', 'Decrypting profile', 'IOS', null, [ + 'LARGE_SECRET_PASSPHRASE', +]); const PLATFORM_DEPLOY__IOS__DECRYPT_CERTIFICATE__STEP_MOCK = utils.createMockStep('Decrypt certificate', 'Decrypting certificate', 'IOS', null, ['LARGE_SECRET_PASSPHRASE']); const PLATFORM_DEPLOY__IOS__DECRYPT_APP_STORE_API_KEY__STEP_MOCK = utils.createMockStep('Decrypt App Store Connect API key', 'Decrypting App Store API key', 'IOS', null, [ 'LARGE_SECRET_PASSPHRASE', @@ -159,7 +162,8 @@ const PLATFORM_DEPLOY__IOS__STEP_MOCKS = [ PLATFORM_DEPLOY__IOS__CACHE_POD_DEPENDENCIES__STEP_MOCK, PLATFORM_DEPLOY__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK, PLATFORM_DEPLOY__IOS__COCOAPODS__STEP_MOCK, - PLATFORM_DEPLOY__IOS__DECRYPT_PROFILE__STEP_MOCK, + PLATFORM_DEPLOY__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK, + PLATFORM_DEPLOY__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK, PLATFORM_DEPLOY__IOS__DECRYPT_CERTIFICATE__STEP_MOCK, PLATFORM_DEPLOY__IOS__DECRYPT_APP_STORE_API_KEY__STEP_MOCK, PLATFORM_DEPLOY__IOS__FASTLANE__STEP_MOCK, diff --git a/workflow_tests/mocks/testBuildMocks.js b/workflow_tests/mocks/testBuildMocks.js index d7ae9abdb8e7..3bacfa154f12 100644 --- a/workflow_tests/mocks/testBuildMocks.js +++ b/workflow_tests/mocks/testBuildMocks.js @@ -116,7 +116,14 @@ const TESTBUILD__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK = utils.createMock IS_PODFILE_SAME_AS_MANIFEST: false, }); const TESTBUILD__IOS__INSTALL_COCOAPODS__STEP_MOCK = utils.createMockStep('Install cocoapods', 'Install cocoapods', 'IOS', ['timeout_minutes', 'max_attempts', 'command'], []); -const TESTBUILD__IOS__DECRYPT_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt profile', 'Decrypt profile', 'IOS', [], ['LARGE_SECRET_PASSPHRASE']); +const TESTBUILD__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt AppStore profile', 'Decrypt AppStore profile', 'IOS', [], ['LARGE_SECRET_PASSPHRASE']); +const TESTBUILD__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK = utils.createMockStep( + 'Decrypt AppStore Notification Service profile', + 'Decrypt AppStore Notification Service profile', + 'IOS', + [], + ['LARGE_SECRET_PASSPHRASE'], +); const TESTBUILD__IOS__DECRYPT_CERTIFICATE__STEP_MOCK = utils.createMockStep('Decrypt certificate', 'Decrypt certificate', 'IOS', [], ['LARGE_SECRET_PASSPHRASE']); const TESTBUILD__IOS__CONFIGURE_AWS_CREDENTIALS__STEP_MOCK = utils.createMockStep( 'Configure AWS Credentials', @@ -137,7 +144,8 @@ const TESTBUILD__IOS__STEP_MOCKS = [ TESTBUILD__IOS__CACHE_POD_DEPENDENCIES__STEP_MOCK, TESTBUILD__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK, TESTBUILD__IOS__INSTALL_COCOAPODS__STEP_MOCK, - TESTBUILD__IOS__DECRYPT_PROFILE__STEP_MOCK, + TESTBUILD__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK, + TESTBUILD__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK, TESTBUILD__IOS__DECRYPT_CERTIFICATE__STEP_MOCK, TESTBUILD__IOS__CONFIGURE_AWS_CREDENTIALS__STEP_MOCK, TESTBUILD__IOS__RUN_FASTLANE__STEP_MOCK, From d79f5ae429a3265b25c9022b934b58616acc69e1 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Thu, 21 Dec 2023 12:45:20 +0500 Subject: [PATCH 47/55] fix: linting --- src/components/ScreenWrapper/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ScreenWrapper/index.js b/src/components/ScreenWrapper/index.js index 5605689e2702..432139353c56 100644 --- a/src/components/ScreenWrapper/index.js +++ b/src/components/ScreenWrapper/index.js @@ -39,6 +39,7 @@ const ScreenWrapper = React.forwardRef( shouldDismissKeyboardBeforeClose, onEntryTransitionEnd, testID, + /** * The navigation prop is passed by the navigator. It is used to trigger the onEntryTransitionEnd callback * when the screen transition ends. From b8429c39e554d55e9ed2ade1514aebb79041a7e8 Mon Sep 17 00:00:00 2001 From: hurali97 Date: Thu, 21 Dec 2023 12:46:02 +0500 Subject: [PATCH 48/55] fix: add comments and linting --- tests/perf-test/ReportScreen.perf-test.js | 26 ++++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/perf-test/ReportScreen.perf-test.js b/tests/perf-test/ReportScreen.perf-test.js index 3be414c148c2..a82903762631 100644 --- a/tests/perf-test/ReportScreen.perf-test.js +++ b/tests/perf-test/ReportScreen.perf-test.js @@ -2,6 +2,7 @@ import {act, fireEvent, screen} from '@testing-library/react-native'; import React from 'react'; import Onyx from 'react-native-onyx'; import {measurePerformance} from 'reassure'; +import _ from 'underscore'; import ComposeProviders from '../../src/components/ComposeProviders'; import DragAndDropProvider from '../../src/components/DragAndDrop/Provider'; import {LocaleContextProvider} from '../../src/components/LocaleContextProvider'; @@ -121,8 +122,7 @@ const createAddListenerMock = () => { transitionEndListeners.push(callback); } return () => { - // eslint-disable-next-line rulesdir/prefer-underscore-method - transitionEndListeners.filter((cb) => cb !== callback); + _.filter(transitionEndListeners, (cb) => cb !== callback); }; }); @@ -156,6 +156,13 @@ const runs = CONST.PERFORMANCE_TESTS.RUNS; test('[ReportScreen] should render ReportScreen with composer interactions', () => { const {triggerTransitionEnd, addListener} = createAddListenerMock(); const scenario = async () => { + /** + * First make sure ReportScreen is mounted, so that we can trigger + * the transitionEnd event manually. + * + * If we don't do that, then the transitionEnd event will be triggered + * before the ReportScreen is mounted, and the test will fail. + */ await screen.findByTestId('ReportScreen'); await act(triggerTransitionEnd); @@ -192,9 +199,7 @@ test('[ReportScreen] should render ReportScreen with composer interactions', () const reportActions = ReportTestUtils.getMockedReportActionsMap(1000); const mockRoute = {params: {reportID: '1'}}; - const navigation = { - addListener, - }; + const navigation = {addListener}; return waitForBatchedUpdates() .then(() => @@ -224,6 +229,13 @@ test('[ReportScreen] should render ReportScreen with composer interactions', () test('[ReportScreen] should press of the report item', () => { const {triggerTransitionEnd, addListener} = createAddListenerMock(); const scenario = async () => { + /** + * First make sure ReportScreen is mounted, so that we can trigger + * the transitionEnd event manually. + * + * If we don't do that, then the transitionEnd event will be triggered + * before the ReportScreen is mounted, and the test will fail. + */ await screen.findByTestId('ReportScreen'); await act(triggerTransitionEnd); @@ -252,9 +264,7 @@ test('[ReportScreen] should press of the report item', () => { const reportActions = ReportTestUtils.getMockedReportActionsMap(1000); const mockRoute = {params: {reportID: '2'}}; - const navigation = { - addListener, - }; + const navigation = {addListener}; return waitForBatchedUpdates() .then(() => From 8725cd21ca073f678e1429cb742fb818a522b747 Mon Sep 17 00:00:00 2001 From: rory Date: Sat, 23 Dec 2023 21:07:04 -0800 Subject: [PATCH 49/55] Clean build after merge --- ios/NewExpensify.xcodeproj/project.pbxproj | 140 ++++++++++++--------- ios/Podfile.lock | 2 +- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index db979f53d13c..bf3e63138979 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -27,18 +27,18 @@ 7041848526A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 7041848626A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; }; 70CF6E82262E297300711ADC /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 70CF6E81262E297300711ADC /* BootSplash.storyboard */; }; + 7F5E81F06BCCF61AD02CEA06 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD444BEDDB0AF1745B39049 /* ExpoModulesProvider.swift */; }; 7F9DD8DA2B2A445B005E3AFA /* ExpError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */; }; 7FD73C9E2B23CE9500420AF3 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */; }; 7FD73CA22B23CE9500420AF3 /* NotificationServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; - 7F5E81F06BCCF61AD02CEA06 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD444BEDDB0AF1745B39049 /* ExpoModulesProvider.swift */; }; 976CCB5F8C921482E6AEAE71 /* libPods-NewExpensify.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AB40AC8872A3DD6EF53D8B94 /* libPods-NewExpensify.a */; }; BDB853621F354EBB84E619C2 /* ExpensifyNewKansas-MediumItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = D2AFB39EC1D44BF9B91D3227 /* ExpensifyNewKansas-MediumItalic.otf */; }; DD79042B2792E76D004484B4 /* RCTBootSplash.m in Sources */ = {isa = PBXBuildFile; fileRef = DD79042A2792E76D004484B4 /* RCTBootSplash.m */; }; DDCB2E57F334C143AC462B43 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D20D83B0E39BA6D21761E72 /* ExpoModulesProvider.swift */; }; E51DC681C7DEE40AEBDDFBFE /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; - E51DC681C7DEE40AEBDDFBFE /* (null) in Frameworks */ = {isa = PBXBuildFile; }; E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; }; ED222ED90E074A5481A854FA /* ExpensifyNeue-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */; }; + EEAE4F8907465429AA5B5520 /* libPods-NewExpensify.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */; }; F0C450EA2705020500FD2970 /* colors.json in Resources */ = {isa = PBXBuildFile; fileRef = F0C450E92705020500FD2970 /* colors.json */; }; FF941A8D48F849269AB85C9A /* ExpensifyNewKansas-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 44BF435285B94E5B95F90994 /* ExpensifyNewKansas-Medium.otf */; }; /* End PBXBuildFile section */ @@ -93,8 +93,8 @@ 1DDE5449979A136852B939B5 /* Pods-NewExpensify.release adhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release adhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release adhoc.xcconfig"; sourceTree = ""; }; 25A4587E168FD67CF890B448 /* Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig"; sourceTree = ""; }; 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releasedevelopment.xcconfig"; sourceTree = ""; }; - 34A8FDD1F9AA58B8F15C8380 /* Pods-NewExpensify.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release production.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release production.xcconfig"; sourceTree = ""; }; 32181F72DC539FFD1D1F0CA4 /* Pods-NewExpensify.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releaseproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releaseproduction.xcconfig"; sourceTree = ""; }; + 34A8FDD1F9AA58B8F15C8380 /* Pods-NewExpensify.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release production.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release production.xcconfig"; sourceTree = ""; }; 374FB8D528A133A7000D84EF /* OriginImageRequestHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OriginImageRequestHandler.h; path = NewExpensify/OriginImageRequestHandler.h; sourceTree = ""; }; 374FB8D628A133FE000D84EF /* OriginImageRequestHandler.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = OriginImageRequestHandler.mm; path = NewExpensify/OriginImageRequestHandler.mm; sourceTree = ""; }; 3BBA44B891E03FAB8255E6F1 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; sourceTree = ""; }; @@ -108,22 +108,22 @@ 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTStartupTimer.m; path = NewExpensify/RCTStartupTimer.m; sourceTree = ""; }; 70CF6E81262E297300711ADC /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = NewExpensify/BootSplash.storyboard; sourceTree = ""; }; 75CABB0D0ABB0082FE0EB600 /* Pods-NewExpensify.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release staging.xcconfig"; sourceTree = ""; }; + 76BE68DA894BB75DDFE278DC /* Pods-NewExpensify.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releasedevelopment.xcconfig"; sourceTree = ""; }; + 7B318CF669A0F7FE948D5CED /* Pods-NewExpensify.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debugadhoc.xcconfig"; sourceTree = ""; }; 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpError.swift; sourceTree = ""; }; 7FD73C9B2B23CE9500420AF3 /* NotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 7FD73C9F2B23CE9500420AF3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8709DF3C8D91F0FC1581CDD7 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig"; sourceTree = ""; }; - 76BE68DA894BB75DDFE278DC /* Pods-NewExpensify.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releasedevelopment.xcconfig"; sourceTree = ""; }; - 7B318CF669A0F7FE948D5CED /* Pods-NewExpensify.debugadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debugadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debugadhoc.xcconfig"; sourceTree = ""; }; 8B28D84EF339436DBD42A203 /* ExpensifyNeue-BoldItalic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-BoldItalic.otf"; path = "../assets/fonts/native/ExpensifyNeue-BoldItalic.otf"; sourceTree = ""; }; 8D3B36BF88E773E3C1A383FA /* Pods-NewExpensify.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debug staging.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debug staging.xcconfig"; sourceTree = ""; }; 90E08F0C8C924EDA018C8866 /* Pods-NotificationServiceExtension.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releaseproduction.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releaseproduction.xcconfig"; sourceTree = ""; }; 96552D489D9F09B6A5ABD81B /* Pods-NewExpensify-NewExpensifyTests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release production.xcconfig"; sourceTree = ""; }; + AB40AC8872A3DD6EF53D8B94 /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + BCD444BEDDB0AF1745B39049 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-NewExpensify-NewExpensifyTests/ExpoModulesProvider.swift"; sourceTree = ""; }; BD6E1BA27D6ABE0AC9D70586 /* Pods-NewExpensify-NewExpensifyTests.release development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release development.xcconfig"; sourceTree = ""; }; BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.releaseadhoc.xcconfig"; sourceTree = ""; }; - AB40AC8872A3DD6EF53D8B94 /* libPods-NewExpensify.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-NewExpensify.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - BCD444BEDDB0AF1745B39049 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-NewExpensify-NewExpensifyTests/ExpoModulesProvider.swift"; sourceTree = ""; }; BF6A4C5167244B9FB8E4D4E3 /* ExpensifyNeue-Italic.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyNeue-Italic.otf"; path = "../assets/fonts/native/ExpensifyNeue-Italic.otf"; sourceTree = ""; }; C3788801E65E896FA7C77298 /* Pods-NewExpensify.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.debugproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.debugproduction.xcconfig"; sourceTree = ""; }; C3FF914C045A138C061D306E /* Pods-NotificationServiceExtension.debugproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.debugproduction.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.debugproduction.xcconfig"; sourceTree = ""; }; @@ -137,8 +137,8 @@ DD79042A2792E76D004484B4 /* RCTBootSplash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTBootSplash.m; path = NewExpensify/RCTBootSplash.m; sourceTree = ""; }; E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig"; sourceTree = ""; }; E2F1036F70CBFE39E9352674 /* Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig"; sourceTree = ""; }; - E61AD6D2DE65B6FB14945CDF /* Pods-NotificationServiceExtension.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; sourceTree = ""; }; E2F78D2A9B3DB96F0524690B /* Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig"; sourceTree = ""; }; + E61AD6D2DE65B6FB14945CDF /* Pods-NotificationServiceExtension.releaseadhoc.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; path = "Target Support Files/Pods-NotificationServiceExtension/Pods-NotificationServiceExtension.releaseadhoc.xcconfig"; sourceTree = ""; }; E681F80D97E6E4BB26194246 /* Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig"; sourceTree = ""; }; E704648954784DDFBAADF568 /* ExpensifyMono-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "ExpensifyMono-Regular.otf"; path = "../assets/fonts/native/ExpensifyMono-Regular.otf"; sourceTree = ""; }; E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = ""; }; @@ -167,8 +167,8 @@ files = ( E51DC681C7DEE40AEBDDFBFE /* BuildFile in Frameworks */, 976CCB5F8C921482E6AEAE71 /* libPods-NewExpensify.a in Frameworks */, - E51DC681C7DEE40AEBDDFBFE /* (null) in Frameworks */, - 5A464BC8112CDB1DE1E38F1C /* libPods-NewExpensify.a in Frameworks */, + E51DC681C7DEE40AEBDDFBFE /* BuildFile in Frameworks */, + EEAE4F8907465429AA5B5520 /* libPods-NewExpensify.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -223,7 +223,6 @@ ED297162215061F000B7C4FE /* JavaScriptCore.framework */, ED2971642150620600B7C4FE /* JavaScriptCore.framework */, AEFE6CD54912D427D19133C7 /* libPods-NewExpensify.a */, - 6FB387B20AE4E6E98858B6AA /* libPods-NewExpensify-NewExpensifyTests.a */, 1A997AA8204EA3D90907FA80 /* libPods-NotificationServiceExtension.a */, AB40AC8872A3DD6EF53D8B94 /* libPods-NewExpensify.a */, 076FD9E41E08971BBF51D580 /* libPods-NewExpensify-NewExpensifyTests.a */, @@ -231,16 +230,6 @@ name = Frameworks; sourceTree = ""; }; - 7FD73C9C2B23CE9500420AF3 /* NotificationServiceExtension */ = { - isa = PBXGroup; - children = ( - 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */, - 7FD73C9F2B23CE9500420AF3 /* Info.plist */, - 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */, - ); - path = NotificationServiceExtension; - sourceTree = ""; - }; 3E1305958E607AC9E2CFA934 /* NewExpensify */ = { isa = PBXGroup; children = ( @@ -258,6 +247,16 @@ name = ExpoModulesProviders; sourceTree = ""; }; + 7FD73C9C2B23CE9500420AF3 /* NotificationServiceExtension */ = { + isa = PBXGroup; + children = ( + 7FD73C9D2B23CE9500420AF3 /* NotificationService.swift */, + 7FD73C9F2B23CE9500420AF3 /* Info.plist */, + 7F9DD8D92B2A445B005E3AFA /* ExpError.swift */, + ); + path = NotificationServiceExtension; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( @@ -328,33 +327,20 @@ isa = PBXGroup; children = ( CECC4CBB97A55705A33BEA9E /* Pods-NewExpensify.debug development.xcconfig */, - 0B09CE5BDAF34DD3573AB4E2 /* Pods-NewExpensify.debug adhoc.xcconfig */, 8D3B36BF88E773E3C1A383FA /* Pods-NewExpensify.debug staging.xcconfig */, - 0E27AA27706D894246E7946D /* Pods-NewExpensify.debug production.xcconfig */, - 02BE6CF80ED1BD2445267F92 /* Pods-NewExpensify.release development.xcconfig */, 1DDE5449979A136852B939B5 /* Pods-NewExpensify.release adhoc.xcconfig */, 75CABB0D0ABB0082FE0EB600 /* Pods-NewExpensify.release staging.xcconfig */, 34A8FDD1F9AA58B8F15C8380 /* Pods-NewExpensify.release production.xcconfig */, E2F1036F70CBFE39E9352674 /* Pods-NewExpensify-NewExpensifyTests.debug development.xcconfig */, - 432FF5842B766535509FC547 /* Pods-NewExpensify-NewExpensifyTests.debug adhoc.xcconfig */, - 3D393D7ABC1092F1DE91397F /* Pods-NewExpensify-NewExpensifyTests.debug staging.xcconfig */, DB76E0D5C670190A0997C71E /* Pods-NewExpensify-NewExpensifyTests.debug production.xcconfig */, BD6E1BA27D6ABE0AC9D70586 /* Pods-NewExpensify-NewExpensifyTests.release development.xcconfig */, - 6B5211DB0EEB46E12DF4AD2D /* Pods-NewExpensify-NewExpensifyTests.release adhoc.xcconfig */, - 6BE16DA6EFF88513DB1CD47B /* Pods-NewExpensify-NewExpensifyTests.release staging.xcconfig */, 96552D489D9F09B6A5ABD81B /* Pods-NewExpensify-NewExpensifyTests.release production.xcconfig */, - 0B627F2A465153FFA6E3A4E0 /* Pods-NewExpensify.debugdevelopment.xcconfig */, - 6F6A514B4DF07A60EC8355BA /* Pods-NewExpensify.debugadhoc.xcconfig */, CE2F84BEE9A6DCC228AF7E42 /* Pods-NewExpensify.debugproduction.xcconfig */, 30FFBD291B71222A393D9CC9 /* Pods-NewExpensify.releasedevelopment.xcconfig */, BD8828A882E2D6B51362AAC3 /* Pods-NewExpensify.releaseadhoc.xcconfig */, - 47D5DF3C6779D41BE70CD031 /* Pods-NewExpensify.releaseproduction.xcconfig */, 8709DF3C8D91F0FC1581CDD7 /* Pods-NewExpensify-NewExpensifyTests.debugdevelopment.xcconfig */, 25A4587E168FD67CF890B448 /* Pods-NewExpensify-NewExpensifyTests.debugadhoc.xcconfig */, - F15A36A3262EEC3B0CAB8EDF /* Pods-NewExpensify-NewExpensifyTests.debugproduction.xcconfig */, - 4E8BF7B08BA3181991BFCF4B /* Pods-NewExpensify-NewExpensifyTests.releasedevelopment.xcconfig */, E2C8555C607612465A7473F8 /* Pods-NewExpensify-NewExpensifyTests.releaseadhoc.xcconfig */, - 57DBBEDB9692E096D4BA0141 /* Pods-NewExpensify-NewExpensifyTests.releaseproduction.xcconfig */, FBEBA6FBED49FB41D6F93896 /* Pods-NotificationServiceExtension.debugdevelopment.xcconfig */, D3F458C994019E6A571461B7 /* Pods-NotificationServiceExtension.debugadhoc.xcconfig */, C3FF914C045A138C061D306E /* Pods-NotificationServiceExtension.debugproduction.xcconfig */, @@ -762,6 +748,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NewExpensify/Pods-NewExpensify-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + F3D35ED760B830954BD8A7BB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-NotificationServiceExtension-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; F6E16E41F88F567A8CDD037C /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -792,28 +800,6 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-NewExpensify/Pods-NewExpensify-resources.sh\"\n"; showEnvVarsInLog = 0; }; - F3D35ED760B830954BD8A7BB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-NotificationServiceExtension-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; FD10A7F022414F080027D42C /* Start Packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1083,12 +1069,17 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1165,12 +1156,17 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1248,12 +1244,17 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1325,11 +1326,16 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1400,11 +1406,16 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.adhoc.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1476,11 +1487,16 @@ INFOPLIST_KEY_CFBundleDisplayName = NotificationServiceExtension; INFOPLIST_KEY_NSHumanReadableCopyright = ""; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 74ead59b069f..318d62f0a944 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1346,6 +1346,6 @@ SPEC CHECKSUMS: Yoga: 3efc43e0d48686ce2e8c60f99d4e6bd349aff981 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: bfe134fd8d3bb1d9232f59a7601623c7193bca3e +PODFILE CHECKSUM: c403784ee1fdf281bcc552696504207f3022cb66 COCOAPODS: 1.12.1 From 672d6ff35fcad63128cc1a23f7584ac6ce85b34a Mon Sep 17 00:00:00 2001 From: rory Date: Mon, 25 Dec 2023 14:50:07 -0800 Subject: [PATCH 50/55] Fix workflow_tests --- workflow_tests/assertions/testBuildAssertions.js | 6 +++--- workflow_tests/mocks/testBuildMocks.js | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/workflow_tests/assertions/testBuildAssertions.js b/workflow_tests/assertions/testBuildAssertions.js index db2d538cd4b9..3fe963f3aa35 100644 --- a/workflow_tests/assertions/testBuildAssertions.js +++ b/workflow_tests/assertions/testBuildAssertions.js @@ -186,13 +186,13 @@ const assertIOSJobExecuted = (workflowResult, ref = '', didExecute = true, fails ], [], ), - utils.createStepAssertion('Decrypt AppStore profile', true, null, 'IOS', 'Decrypt AppStore profile', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), + utils.createStepAssertion('Decrypt AdHoc profile', true, null, 'IOS', 'Decrypt AdHoc profile', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}]), utils.createStepAssertion( - 'Decrypt AppStore Notification Service profile', + 'Decrypt AdHoc Notification Service profile', true, null, 'IOS', - 'Decrypt AppStore Notification Service profile', + 'Decrypt AdHoc Notification Service profile', [], [{key: 'LARGE_SECRET_PASSPHRASE', value: '***'}], ), diff --git a/workflow_tests/mocks/testBuildMocks.js b/workflow_tests/mocks/testBuildMocks.js index adfae9567f3e..37bcc5fb6fac 100644 --- a/workflow_tests/mocks/testBuildMocks.js +++ b/workflow_tests/mocks/testBuildMocks.js @@ -116,10 +116,10 @@ const TESTBUILD__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK = utils.createMock IS_PODFILE_SAME_AS_MANIFEST: false, }); const TESTBUILD__IOS__INSTALL_COCOAPODS__STEP_MOCK = utils.createMockStep('Install cocoapods', 'Install cocoapods', 'IOS', ['timeout_minutes', 'max_attempts', 'command'], []); -const TESTBUILD__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt AppStore profile', 'Decrypt AppStore profile', 'IOS', [], ['LARGE_SECRET_PASSPHRASE']); -const TESTBUILD__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK = utils.createMockStep( - 'Decrypt AppStore Notification Service profile', - 'Decrypt AppStore Notification Service profile', +const TESTBUILD__IOS__DECRYPT_ADHOC_PROFILE__STEP_MOCK = utils.createMockStep('Decrypt AdHoc profile', 'Decrypt AdHoc profile', 'IOS', [], ['LARGE_SECRET_PASSPHRASE']); +const TESTBUILD__IOS__DECRYPT_ADHOC_NSE_PROFILE__STEP_MOCK = utils.createMockStep( + 'Decrypt AdHoc Notification Service profile', + 'Decrypt AdHoc Notification Service profile', 'IOS', [], ['LARGE_SECRET_PASSPHRASE'], @@ -144,8 +144,8 @@ const TESTBUILD__IOS__STEP_MOCKS = [ TESTBUILD__IOS__CACHE_POD_DEPENDENCIES__STEP_MOCK, TESTBUILD__IOS__COMPARE_PODFILE_AND_MANIFEST__STEP_MOCK, TESTBUILD__IOS__INSTALL_COCOAPODS__STEP_MOCK, - TESTBUILD__IOS__DECRYPT_APPSTORE_PROFILE__STEP_MOCK, - TESTBUILD__IOS__DECRYPT_APPSTORE_NSE_PROFILE__STEP_MOCK, + TESTBUILD__IOS__DECRYPT_ADHOC_PROFILE__STEP_MOCK, + TESTBUILD__IOS__DECRYPT_ADHOC_NSE_PROFILE__STEP_MOCK, TESTBUILD__IOS__DECRYPT_CERTIFICATE__STEP_MOCK, TESTBUILD__IOS__CONFIGURE_AWS_CREDENTIALS__STEP_MOCK, TESTBUILD__IOS__RUN_FASTLANE__STEP_MOCK, From a39f71146b76aecf6e311763567e1af77ed048d0 Mon Sep 17 00:00:00 2001 From: Andrew Rosiclair Date: Tue, 26 Dec 2023 13:02:35 -0500 Subject: [PATCH 51/55] fix dev bundle IDs for NSE --- ios/NewExpensify.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/NewExpensify.xcodeproj/project.pbxproj b/ios/NewExpensify.xcodeproj/project.pbxproj index bf3e63138979..c239f4da183f 100644 --- a/ios/NewExpensify.xcodeproj/project.pbxproj +++ b/ios/NewExpensify.xcodeproj/project.pbxproj @@ -1080,7 +1080,7 @@ MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; - PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development: Notification Service"; @@ -1336,7 +1336,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; - PRODUCT_BUNDLE_IDENTIFIER = com.chat.expensify.chat.NotificationServiceExtension; + PRODUCT_BUNDLE_IDENTIFIER = com.expensify.chat.dev.NotificationServiceExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "(NewApp) Development: Notification Service"; From d7e60e8f179d11fd46f048da3425a70eeddb36db Mon Sep 17 00:00:00 2001 From: Pujan Date: Thu, 28 Dec 2023 02:19:21 +0530 Subject: [PATCH 52/55] replaced testID with nativeID for option selector --- src/components/OptionRow.js | 2 +- src/components/OptionsSelector/BaseOptionsSelector.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/OptionRow.js b/src/components/OptionRow.js index 755c94d86f25..c31ed7af1e90 100644 --- a/src/components/OptionRow.js +++ b/src/components/OptionRow.js @@ -165,7 +165,7 @@ function OptionRow(props) { {(hovered) => ( (pressableRef.current = el)} onPress={(e) => { if (!props.onSelectRow) { diff --git a/src/components/OptionsSelector/BaseOptionsSelector.js b/src/components/OptionsSelector/BaseOptionsSelector.js index a9a76d3ea0e6..792073b72613 100755 --- a/src/components/OptionsSelector/BaseOptionsSelector.js +++ b/src/components/OptionsSelector/BaseOptionsSelector.js @@ -303,7 +303,7 @@ class BaseOptionsSelector extends Component { } selectFocusedOption(e) { - const focusedItemKey = lodashGet(e, ['target', 'attributes', 'data-testid', 'value']); + const focusedItemKey = lodashGet(e, ['target', 'attributes', 'id', 'value']); const focusedOption = focusedItemKey ? _.find(this.state.allOptions, (option) => option.keyForList === focusedItemKey) : this.state.allOptions[this.state.focusedIndex]; if (!focusedOption || !this.props.isFocused) { From 3b7fa0620c2cc2b1a1fe41981724610b32e90879 Mon Sep 17 00:00:00 2001 From: Pujan Date: Thu, 28 Dec 2023 02:44:33 +0530 Subject: [PATCH 53/55] used nativeID for selection list --- src/components/SelectionList/BaseListItem.js | 2 +- src/components/SelectionList/BaseSelectionList.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/SelectionList/BaseListItem.js b/src/components/SelectionList/BaseListItem.js index ac679f32d103..443b930d5e7a 100644 --- a/src/components/SelectionList/BaseListItem.js +++ b/src/components/SelectionList/BaseListItem.js @@ -49,7 +49,7 @@ function BaseListItem({ hoverStyle={styles.hoveredComponentBG} dataSet={{[CONST.SELECTION_SCRAPER_HIDDEN_ELEMENT]: true}} onMouseDown={shouldPreventDefaultFocusOnSelectRow ? (e) => e.preventDefault() : undefined} - testID={keyForList} + nativeID={keyForList} > { - const focusedItemKey = lodashGet(e, ['target', 'attributes', 'data-testid', 'value']); + const focusedItemKey = lodashGet(e, ['target', 'attributes', 'id', 'value']); const focusedOption = focusedItemKey ? _.find(flattenedSections.allOptions, (option) => option.keyForList === focusedItemKey) : flattenedSections.allOptions[focusedIndex]; if (!focusedOption || focusedOption.isDisabled) { From f3673e47d41495eb27eca15ecbadc55e001f8d0e Mon Sep 17 00:00:00 2001 From: Neil Marcellini Date: Wed, 27 Dec 2023 13:53:57 -0800 Subject: [PATCH 54/55] Revert "Fixed Android - Chat - Message gets displayed from right to left" --- src/libs/convertToLTR/index.android.ts | 9 ++- src/libs/convertToLTR/index.ts | 1 - .../convertToLTRForComposer/index.android.ts | 63 +------------------ src/libs/convertToLTRForComposer/index.ts | 5 -- src/libs/convertToLTRForComposer/types.ts | 2 +- .../ComposerWithSuggestions.js | 41 ++++-------- 6 files changed, 18 insertions(+), 103 deletions(-) diff --git a/src/libs/convertToLTR/index.android.ts b/src/libs/convertToLTR/index.android.ts index 0de503e3b6c6..d73fd3de7a21 100644 --- a/src/libs/convertToLTR/index.android.ts +++ b/src/libs/convertToLTR/index.android.ts @@ -1,11 +1,10 @@ -/** - * Android only - convert RTL text to a LTR text using Unicode controls. - * - * In React Native, when working with bidirectional text (RTL - Right-to-Left or LTR - Left-to-Right), you may encounter issues related to text rendering, especially on Android devices. These issues arise because Android's default behavior for text direction might not always align with the desired directionality of your app. - */ import CONST from '@src/CONST'; import ConvertToLTR from './types'; +/** + * Android only - convert RTL text to a LTR text using Unicode controls. + * https://www.w3.org/International/questions/qa-bidi-unicode-controls + */ const convertToLTR: ConvertToLTR = (text) => `${CONST.UNICODE.LTR}${text}`; export default convertToLTR; diff --git a/src/libs/convertToLTR/index.ts b/src/libs/convertToLTR/index.ts index 0dca0d0b3ace..58d8be93836e 100644 --- a/src/libs/convertToLTR/index.ts +++ b/src/libs/convertToLTR/index.ts @@ -1,4 +1,3 @@ -// The Android platform has to handle switching between LTR and RTL languages a bit differently (https://developer.android.com/training/basics/supporting-devices/languages). For all other platforms, these can simply be no-op functions. import ConvertToLTR from './types'; const convertToLTR: ConvertToLTR = (text) => text; diff --git a/src/libs/convertToLTRForComposer/index.android.ts b/src/libs/convertToLTRForComposer/index.android.ts index 0d68baa80e3a..09e7f2e5cd87 100644 --- a/src/libs/convertToLTRForComposer/index.android.ts +++ b/src/libs/convertToLTRForComposer/index.android.ts @@ -1,69 +1,8 @@ -import CONST from '@src/CONST'; import ConvertToLTRForComposer from './types'; -/** - * Android only - The composer can be converted to LTR if its content is the LTR character followed by an @ or space - * because to mention sugggestion works the @ character must not have any character at the beginning e.g.: \u2066@ doesn't work - * also to avoid sending empty messages the unicode character with space could enable the send button. - */ -function canComposerBeConvertedToLTR(text: string): boolean { - // This regex handles the case when a user only types spaces into the composer. - const containOnlySpaces = /^\s*$/; - // This regex handles the case where someone has RTL enabled and they began typing an @mention for someone. - const startsWithLTRAndAt = new RegExp(`^${CONST.UNICODE.LTR}@$`); - // This regex handles the case where the composer can contain multiple lines of whitespace - const startsWithLTRAndSpace = new RegExp(`${CONST.UNICODE.LTR}\\s*$`); - const emptyExpressions = [containOnlySpaces, startsWithLTRAndAt, startsWithLTRAndSpace]; - return emptyExpressions.some((exp) => exp.test(text)); -} - -/** - * Android only - We should remove the LTR unicode when the input is empty to prevent: - * Sending an empty message; - * Mention suggestions not works if @ or \s (at or space) is the first character; - * Placeholder is not displayed if the unicode character is the only character remaining; - * - * @param {String} newComment - the comment written by the user - * @param {Boolean} force - always remove the LTR unicode, going to be used when composer is consider as empty - * @return {String} - */ - -const resetLTRWhenEmpty = (newComment: string, force?: boolean) => { - const result = newComment.length <= 1 || force ? newComment.replaceAll(CONST.UNICODE.LTR, '') : newComment; - return result; -}; - /** * Android only - Do not convert RTL text to a LTR text for input box using Unicode controls. * Android does not properly support bidirectional text for mixed content for input box */ -const convertToLTRForComposer: ConvertToLTRForComposer = (text, isComposerEmpty) => { - const shouldComposerMaintainAsLTR = canComposerBeConvertedToLTR(text); - const newText = resetLTRWhenEmpty(text, shouldComposerMaintainAsLTR); - if (shouldComposerMaintainAsLTR) { - return newText; - } - return isComposerEmpty ? `${CONST.UNICODE.LTR}${newText}` : newText; -}; - -/** - * This is necessary to convert the input to LTR, there is a delay that causes the cursor not to go to the end of the input line when pasting text or typing fast. The delay is caused for the time that takes the input to convert from RTL to LTR and viceversa. - */ -const moveCursorToEndOfLine = ( - commentLength: number, - setSelection: ( - value: React.SetStateAction<{ - start: number; - end: number; - }>, - ) => void, -) => { - setSelection({ - start: commentLength + 1, - end: commentLength + 1, - }); -}; - -export {moveCursorToEndOfLine}; - +const convertToLTRForComposer: ConvertToLTRForComposer = (text) => text; export default convertToLTRForComposer; diff --git a/src/libs/convertToLTRForComposer/index.ts b/src/libs/convertToLTRForComposer/index.ts index 9286a41a6712..dd6ee50d862e 100644 --- a/src/libs/convertToLTRForComposer/index.ts +++ b/src/libs/convertToLTRForComposer/index.ts @@ -30,9 +30,4 @@ const convertToLTRForComposer: ConvertToLTRForComposer = (text) => { // Add the LTR marker to the beginning of the text. return `${CONST.UNICODE.LTR}${text}`; }; - -const moveCursorToEndOfLine = (commentLength: number) => commentLength; - -export {moveCursorToEndOfLine}; - export default convertToLTRForComposer; diff --git a/src/libs/convertToLTRForComposer/types.ts b/src/libs/convertToLTRForComposer/types.ts index 88f468ef1843..c6edeaaba446 100644 --- a/src/libs/convertToLTRForComposer/types.ts +++ b/src/libs/convertToLTRForComposer/types.ts @@ -1,3 +1,3 @@ -type ConvertToLTRForComposer = (text: string, isComposerEmpty?: boolean) => string; +type ConvertToLTRForComposer = (text: string) => string; export default ConvertToLTRForComposer; diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js index 6ed6271dd87f..8def3a53ca0d 100644 --- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js +++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.js @@ -18,7 +18,7 @@ import canFocusInputOnScreenFocus from '@libs/canFocusInputOnScreenFocus'; import compose from '@libs/compose'; import * as ComposerUtils from '@libs/ComposerUtils'; import getDraftComment from '@libs/ComposerUtils/getDraftComment'; -import convertToLTRForComposer, {moveCursorToEndOfLine} from '@libs/convertToLTRForComposer'; +import convertToLTRForComposer from '@libs/convertToLTRForComposer'; import * as EmojiUtils from '@libs/EmojiUtils'; import focusComposerWithDelay from '@libs/focusComposerWithDelay'; import * as KeyDownListener from '@libs/KeyboardShortcut/KeyDownPressListener'; @@ -108,7 +108,6 @@ function ComposerWithSuggestions({ const StyleUtils = useStyleUtils(); const {preferredLocale} = useLocalize(); const isFocused = useIsFocused(); - const composerIsEmpty = useRef(true); const navigation = useNavigation(); const emojisPresentBefore = useRef([]); const [value, setValue] = useState(() => { @@ -224,33 +223,18 @@ function ComposerWithSuggestions({ debouncedUpdateFrequentlyUsedEmojis(); } } - - let newCommentConvertedToLTR = newComment; - const prevComment = commentRef.current; - - // This prevent the double execution of setting input value that could affect the place holder and could send an empty message or draft messages in android - if (prevComment !== newComment) { - newCommentConvertedToLTR = convertToLTRForComposer(newCommentConvertedToLTR, composerIsEmpty.current); - setValue(newCommentConvertedToLTR); - moveCursorToEndOfLine(newComment.length, setSelection); - composerIsEmpty.current = false; - } - - const isNewCommentEmpty = !!newCommentConvertedToLTR.match(/^(\s)*$/); - const isPrevCommentEmpty = !!prevComment.match(/^(\s)*$/); + const newCommentConverted = convertToLTRForComposer(newComment); + const isNewCommentEmpty = !!newCommentConverted.match(/^(\s)*$/); + const isPrevCommentEmpty = !!commentRef.current.match(/^(\s)*$/); /** Only update isCommentEmpty state if it's different from previous one */ if (isNewCommentEmpty !== isPrevCommentEmpty) { setIsCommentEmpty(isNewCommentEmpty); - if (isNewCommentEmpty) { - composerIsEmpty.current = true; - } } - emojisPresentBefore.current = emojis; - + setValue(newCommentConverted); if (commentValue !== newComment) { - const position = Math.max(selection.end + (newComment.length - prevComment.length), cursorPosition || 0); + const position = Math.max(selection.end + (newComment.length - commentRef.current.length), cursorPosition || 0); setSelection({ start: position, end: position, @@ -258,22 +242,22 @@ function ComposerWithSuggestions({ } // Indicate that draft has been created. - if (prevComment.length === 0 && newCommentConvertedToLTR.length !== 0) { + if (commentRef.current.length === 0 && newCommentConverted.length !== 0) { Report.setReportWithDraft(reportID, true); } // The draft has been deleted. - if (newCommentConvertedToLTR.length === 0) { + if (newCommentConverted.length === 0) { Report.setReportWithDraft(reportID, false); } - commentRef.current = newCommentConvertedToLTR; + commentRef.current = newCommentConverted; if (shouldDebounceSaveComment) { - debouncedSaveReportComment(reportID, newCommentConvertedToLTR); + debouncedSaveReportComment(reportID, newCommentConverted); } else { - Report.saveReportComment(reportID, newCommentConvertedToLTR || ''); + Report.saveReportComment(reportID, newCommentConverted || ''); } - if (newCommentConvertedToLTR) { + if (newCommentConverted) { debouncedBroadcastUserIsTyping(reportID); } }, @@ -287,7 +271,6 @@ function ComposerWithSuggestions({ raiseIsScrollLikelyLayoutTriggered, debouncedSaveReportComment, selection.end, - composerIsEmpty, ], ); From 93db6dbcef5717b6492d516622cab248b736f4b3 Mon Sep 17 00:00:00 2001 From: OSBotify Date: Wed, 27 Dec 2023 22:37:28 +0000 Subject: [PATCH 55/55] Update version to 1.4.18-3 --- android/app/build.gradle | 4 ++-- ios/NewExpensify/Info.plist | 10 +++++----- ios/NewExpensifyTests/Info.plist | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index c8d2169787f9..341c9ff046a1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -96,8 +96,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001041802 - versionName "1.4.18-2" + versionCode 1001041803 + versionName "1.4.18-3" } flavorDimensions "default" diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 1a249921c30d..51de98b49720 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.18.2 + 1.4.18.3 ITSAppUsesNonExemptEncryption LSApplicationQueriesSchemes @@ -85,6 +85,10 @@ Your camera roll is used to store chat attachments. NSPhotoLibraryUsageDescription Your photos are used to create chat attachments. + NSUserActivityTypes + + INSendMessageIntent + UIAppFonts ExpensifyNewKansas-Medium.otf @@ -122,9 +126,5 @@ UIViewControllerBasedStatusBarAppearance - NSUserActivityTypes - - INSendMessageIntent - diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index a23b037c4d91..c68c221f7add 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -19,6 +19,6 @@ CFBundleSignature ???? CFBundleVersion - 1.4.18.2 + 1.4.18.3 diff --git a/package-lock.json b/package-lock.json index 40699c67cba8..24b5aa47977c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "new.expensify", - "version": "1.4.18-2", + "version": "1.4.18-3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.18-2", + "version": "1.4.18-3", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3aee3b018d08..230c069a1b9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.18-2", + "version": "1.4.18-3", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.",