diff --git a/android/app/build.gradle b/android/app/build.gradle index b578c27..eafb442 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: "com.android.application" apply plugin: "com.facebook.react" +apply plugin: 'com.google.gms.google-services' apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" import com.android.build.OutputFile @@ -25,7 +26,7 @@ android { applicationId "com.app.task_me" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 227 + versionCode 228 versionName "2.3" resValue "string", "build_config_package", "com.app.task_me" } @@ -87,7 +88,7 @@ dependencies { implementation("com.facebook.react:react-android") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") - implementation project(':react-native-view-pdf') + implementation project(':react-native-view-pdf')\ debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..3781a1d --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,39 @@ +{ + "project_info": { + "project_number": "129356575548", + "project_id": "taskme-dae7e", + "storage_bucket": "taskme-dae7e.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:129356575548:android:0d83a97ad1276b3ff26439", + "android_client_info": { + "package_name": "com.app.task_me" + } + }, + "oauth_client": [ + { + "client_id": "129356575548-iv9mo7k86o4rpgupn67s1gs67se8vioe.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCigUJBly47PVRbCHItRMwVfxqXct2H8U4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "129356575548-iv9mo7k86o4rpgupn67s1gs67se8vioe.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6bd3715..4cf99d6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -108,6 +108,8 @@ + + diff --git a/android/build.gradle b/android/build.gradle index 0cc415a..d6f486d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -24,6 +24,7 @@ buildscript { dependencies { classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") + classpath 'com.google.gms:google-services:4.4.1' } subprojects { subproject -> afterEvaluate{ diff --git a/ios/CallKitEventHandler.swift b/ios/CallKitEventHandler.swift new file mode 100644 index 0000000..1efd719 --- /dev/null +++ b/ios/CallKitEventHandler.swift @@ -0,0 +1,25 @@ +import CallKit + +class CallObserver: NSObject, CXCallObserverDelegate { + + let callObserver = CXCallObserver() + + override init() { + super.init() + callObserver.setDelegate(self, queue: nil) + } + + func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) { + if call.hasEnded { + print("Call ended") + } else if call.isOutgoing { + print("Outgoing call") + } else if call.isOnHold { + print("Call on hold") + } else if callObserver.calls.contains(where: { $0.isMuted }) { + print("Call muted") + } else { + print("Call status changed") + } + } +} diff --git a/ios/OneSignalNotificationServiceExtension/NotificationService.swift b/ios/OneSignalNotificationServiceExtension/NotificationService.swift index 7891846..bbe8e91 100644 --- a/ios/OneSignalNotificationServiceExtension/NotificationService.swift +++ b/ios/OneSignalNotificationServiceExtension/NotificationService.swift @@ -12,6 +12,8 @@ class NotificationService: UNNotificationServiceExtension { self.receivedRequest = request self.contentHandler = contentHandler self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + print("Received silent push notification with type: silent") if let bestAttemptContent = bestAttemptContent { //If your SDK version is < 3.5.0 uncomment and use this code: @@ -26,6 +28,8 @@ class NotificationService: UNNotificationServiceExtension { //OneSignal.setLogLevel(.LL_VERBOSE, visualLevel: .LL_NONE) //bestAttemptContent.body = "[Modified] " + bestAttemptContent.body + print("Received silent push notification with type: silent") + OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: bestAttemptContent, withContentHandler: self.contentHandler) } } diff --git a/ios/Podfile b/ios/Podfile index 669985d..638c620 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,4 +1,3 @@ -# Resolve react_native_pods.rb with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', 'require.resolve( "react-native/scripts/react_native_pods.rb", @@ -8,16 +7,6 @@ require Pod::Executable.execute_command('node', ['-p', platform :ios, min_ios_version_supported prepare_react_native_project! -# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. -# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded -# -# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` -# ```js -# module.exports = { -# dependencies: { -# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), -# ``` -flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled linkage = ENV['USE_FRAMEWORKS'] if linkage != nil @@ -32,23 +21,19 @@ target 'taskme2' do pod 'react-native-sqlite-storage', :path => '../node_modules/react-native-sqlite-storage' pod 'react-native-config/Extension', :path => '../node_modules/react-native-config' pod 'RNCallKeep', :path => '../node_modules/react-native-callkeep' + pod 'ReactNativeIncallManager', :path => '../node_modules/react-native-incall-manager' - # Flags change depending on the env values. flags = get_default_flags() + pod 'Firebase', :modular_headers => true + pod 'FirebaseCoreInternal', :modular_headers => true + pod 'GoogleUtilities', :modular_headers => true + pod 'FirebaseCore', :modular_headers => true + use_react_native!( :path => config[:reactNativePath], - # Hermes is now enabled by default. Disable by setting this flag to false. - # Upcoming versions of React Native may rely on get_default_flags(), but - # we make it explicit here to aid in the React Native upgrade process. :hermes_enabled => flags[:hermes_enabled], :fabric_enabled => flags[:fabric_enabled], - # Enables Flipper. - # - # Note that if you have use_frameworks! enabled, Flipper will not work and - # you should disable the next line. - :flipper_configuration => flipper_config, - # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) @@ -71,7 +56,6 @@ target 'taskme2' do end end - # Set the preprocessing macro for the whole Pods project existing_flags = config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)'] existing_flags << '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION' config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = existing_flags diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 52f3fa2..b52f273 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,6 +1,5 @@ PODS: - boost (1.76.0) - - CocoaAsyncSocket (7.6.5) - DoubleConversion (1.1.6) - FBLazyVector (0.72.10) - FBReactNativeSpec (0.72.10): @@ -14,66 +13,126 @@ PODS: - ffmpeg-kit-react-native/audio (5.1.0): - ffmpeg-kit-ios-audio (= 5.1) - React-Core - - Flipper (0.182.0): - - Flipper-Folly (~> 2.6) - - Flipper-Boost-iOSX (1.76.0.1.11) - - Flipper-DoubleConversion (3.2.0.1) - - Flipper-Fmt (7.1.7) - - Flipper-Folly (2.6.10): - - Flipper-Boost-iOSX - - Flipper-DoubleConversion - - Flipper-Fmt (= 7.1.7) - - Flipper-Glog - - libevent (~> 2.1.12) - - OpenSSL-Universal (= 1.1.1100) - - Flipper-Glog (0.5.0.5) - - Flipper-PeerTalk (0.0.4) - - FlipperKit (0.182.0): - - FlipperKit/Core (= 0.182.0) - - FlipperKit/Core (0.182.0): - - Flipper (~> 0.182.0) - - FlipperKit/CppBridge - - FlipperKit/FBCxxFollyDynamicConvert - - FlipperKit/FBDefines - - FlipperKit/FKPortForwarding - - SocketRocket (~> 0.6.0) - - FlipperKit/CppBridge (0.182.0): - - Flipper (~> 0.182.0) - - FlipperKit/FBCxxFollyDynamicConvert (0.182.0): - - Flipper-Folly (~> 2.6) - - FlipperKit/FBDefines (0.182.0) - - FlipperKit/FKPortForwarding (0.182.0): - - CocoaAsyncSocket (~> 7.6) - - Flipper-PeerTalk (~> 0.0.4) - - FlipperKit/FlipperKitHighlightOverlay (0.182.0) - - FlipperKit/FlipperKitLayoutHelpers (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutTextSearchable - - FlipperKit/FlipperKitLayoutIOSDescriptors (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutPlugin (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitHighlightOverlay - - FlipperKit/FlipperKitLayoutHelpers - - FlipperKit/FlipperKitLayoutIOSDescriptors - - FlipperKit/FlipperKitLayoutTextSearchable - - YogaKit (~> 1.18) - - FlipperKit/FlipperKitLayoutTextSearchable (0.182.0) - - FlipperKit/FlipperKitNetworkPlugin (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitReactPlugin (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitUserDefaultsPlugin (0.182.0): - - FlipperKit/Core - - FlipperKit/SKIOSNetworkPlugin (0.182.0): - - FlipperKit/Core - - FlipperKit/FlipperKitNetworkPlugin + - Firebase (10.23.1): + - Firebase/Core (= 10.23.1) + - Firebase/Core (10.23.1): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.23.1) + - Firebase/CoreOnly (10.23.1): + - FirebaseCore (= 10.23.1) + - Firebase/Messaging (10.23.1): + - Firebase/CoreOnly + - FirebaseMessaging (~> 10.23.0) + - FirebaseAnalytics (10.23.1): + - FirebaseAnalytics/AdIdSupport (= 10.23.1) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.23.1): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.23.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - FirebaseCore (10.23.1): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.12) + - GoogleUtilities/Logger (~> 7.12) + - FirebaseCoreExtension (10.23.0): + - FirebaseCore (~> 10.0) + - FirebaseCoreInternal (10.23.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseInstallations (10.23.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseMessaging (10.23.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.3) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Reachability (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - nanopb (< 2.30911.0, >= 2.30908.0) - fmt (6.2.1) - glog (0.3.5) + - GoogleAppMeasurement (10.23.1): + - GoogleAppMeasurement/AdIdSupport (= 10.23.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.23.1): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.23.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.23.1): + - GoogleUtilities/AppDelegateSwizzler (~> 7.11) + - GoogleUtilities/MethodSwizzler (~> 7.11) + - GoogleUtilities/Network (~> 7.11) + - "GoogleUtilities/NSData+zlib (~> 7.11)" + - nanopb (< 2.30911.0, >= 2.30908.0) + - GoogleDataTransport (9.4.1): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30911.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities (7.13.0): + - GoogleUtilities/AppDelegateSwizzler (= 7.13.0) + - GoogleUtilities/Environment (= 7.13.0) + - GoogleUtilities/ISASwizzler (= 7.13.0) + - GoogleUtilities/Logger (= 7.13.0) + - GoogleUtilities/MethodSwizzler (= 7.13.0) + - GoogleUtilities/Network (= 7.13.0) + - "GoogleUtilities/NSData+zlib (= 7.13.0)" + - GoogleUtilities/Privacy (= 7.13.0) + - GoogleUtilities/Reachability (= 7.13.0) + - GoogleUtilities/SwizzlerTestHelpers (= 7.13.0) + - GoogleUtilities/UserDefaults (= 7.13.0) + - GoogleUtilities/AppDelegateSwizzler (7.13.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (7.13.0): + - GoogleUtilities/Privacy + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/ISASwizzler (7.13.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (7.13.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/MethodSwizzler (7.13.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/Network (7.13.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.13.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (7.13.0) + - GoogleUtilities/Reachability (7.13.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/SwizzlerTestHelpers (7.13.0): + - GoogleUtilities/MethodSwizzler + - GoogleUtilities/UserDefaults (7.13.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy - hermes-engine (0.72.10): - hermes-engine/Pre-built (= 0.72.10) - hermes-engine/Pre-built (0.72.10) @@ -91,6 +150,11 @@ PODS: - libwebp/sharpyuv (1.3.2) - libwebp/webp (1.3.2): - libwebp/sharpyuv + - nanopb (2.30910.0): + - nanopb/decode (= 2.30910.0) + - nanopb/encode (= 2.30910.0) + - nanopb/decode (2.30910.0) + - nanopb/encode (2.30910.0) - OneSignalXCFramework (3.12.6): - OneSignalXCFramework/OneSignalCore (= 3.12.6) - OneSignalXCFramework/OneSignalExtension (= 3.12.6) @@ -101,7 +165,7 @@ PODS: - OneSignalXCFramework/OneSignalOutcomes - OneSignalXCFramework/OneSignalOutcomes (3.12.6): - OneSignalXCFramework/OneSignalCore - - OpenSSL-Universal (1.1.1100) + - PromisesObjC (2.4.0) - RCT-Folly (2021.07.22.00): - boost - DoubleConversion @@ -560,6 +624,8 @@ PODS: - React-perflogger (= 0.72.10) - ReactNativeExceptionHandler (2.10.10): - React-Core + - ReactNativeIncallManager (4.2.0): + - React-Core - rn-fetch-blob (0.12.0): - React-Core - RNAudioRecorderPlayer (3.6.6): @@ -580,6 +646,14 @@ PODS: - React-Core - SDWebImage (~> 5.11.1) - SDWebImageWebPCoder (~> 0.8.4) + - RNFBApp (19.1.2): + - Firebase/CoreOnly (= 10.23.1) + - React-Core + - RNFBMessaging (19.1.2): + - Firebase/Messaging (= 10.23.1) + - FirebaseCoreExtension + - React-Core + - RNFBApp - RNFileViewer (2.1.5): - React-Core - RNFS (2.20.0): @@ -630,10 +704,8 @@ PODS: - libwebp (~> 1.0) - SDWebImage/Core (~> 5.10) - SocketRocket (0.6.1) - - TOCropViewController (2.6.1) + - TOCropViewController (2.7.2) - Yoga (1.14.0) - - YogaKit (1.18.1): - - Yoga (~> 1.14) DEPENDENCIES: - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) @@ -641,31 +713,14 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - ffmpeg-kit-react-native/audio (from `../node_modules/ffmpeg-kit-react-native/ffmpeg-kit-react-native.podspec`) - - Flipper (= 0.182.0) - - Flipper-Boost-iOSX (= 1.76.0.1.11) - - Flipper-DoubleConversion (= 3.2.0.1) - - Flipper-Fmt (= 7.1.7) - - Flipper-Folly (= 2.6.10) - - Flipper-Glog (= 0.5.0.5) - - Flipper-PeerTalk (= 0.0.4) - - FlipperKit (= 0.182.0) - - FlipperKit/Core (= 0.182.0) - - FlipperKit/CppBridge (= 0.182.0) - - FlipperKit/FBCxxFollyDynamicConvert (= 0.182.0) - - FlipperKit/FBDefines (= 0.182.0) - - FlipperKit/FKPortForwarding (= 0.182.0) - - FlipperKit/FlipperKitHighlightOverlay (= 0.182.0) - - FlipperKit/FlipperKitLayoutPlugin (= 0.182.0) - - FlipperKit/FlipperKitLayoutTextSearchable (= 0.182.0) - - FlipperKit/FlipperKitNetworkPlugin (= 0.182.0) - - FlipperKit/FlipperKitReactPlugin (= 0.182.0) - - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.182.0) - - FlipperKit/SKIOSNetworkPlugin (= 0.182.0) + - Firebase + - FirebaseCore + - FirebaseCoreInternal - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - GoogleUtilities - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) - libevent (~> 2.1.12) - OneSignalXCFramework (< 4.0, >= 3.0) - - OpenSSL-Universal (= 1.1.1100) - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) @@ -673,7 +728,6 @@ DEPENDENCIES: - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) - React-Codegen (from `build/generated/ios`) - React-Core (from `../node_modules/react-native/`) - - React-Core/DevSupport (from `../node_modules/react-native/`) - React-Core/RCTWebSocket (from `../node_modules/react-native/`) - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) @@ -720,6 +774,7 @@ DEPENDENCIES: - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) - ReactNativeExceptionHandler (from `../node_modules/react-native-exception-handler`) + - ReactNativeIncallManager (from `../node_modules/react-native-incall-manager`) - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - RNAudioRecorderPlayer (from `../node_modules/react-native-audio-recorder-player`) - RNCallKeep (from `../node_modules/react-native-callkeep`) @@ -729,6 +784,8 @@ DEPENDENCIES: - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" - RNDeviceInfo (from `../node_modules/react-native-device-info`) - RNFastImage (from `../node_modules/react-native-fast-image`) + - "RNFBApp (from `../node_modules/@react-native-firebase/app`)" + - "RNFBMessaging (from `../node_modules/@react-native-firebase/messaging`)" - RNFileViewer (from `../node_modules/react-native-file-viewer`) - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) @@ -747,27 +804,28 @@ DEPENDENCIES: SPEC REPOS: trunk: - - CocoaAsyncSocket - ffmpeg-kit-ios-audio - - Flipper - - Flipper-Boost-iOSX - - Flipper-DoubleConversion - - Flipper-Fmt - - Flipper-Folly - - Flipper-Glog - - Flipper-PeerTalk - - FlipperKit + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging - fmt + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities - JitsiWebRTC - libevent - libwebp + - nanopb - OneSignalXCFramework - - OpenSSL-Universal + - PromisesObjC - SDWebImage - SDWebImageWebPCoder - SocketRocket - TOCropViewController - - YogaKit EXTERNAL SOURCES: boost: @@ -886,6 +944,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" ReactNativeExceptionHandler: :path: "../node_modules/react-native-exception-handler" + ReactNativeIncallManager: + :path: "../node_modules/react-native-incall-manager" rn-fetch-blob: :path: "../node_modules/rn-fetch-blob" RNAudioRecorderPlayer: @@ -904,6 +964,10 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-device-info" RNFastImage: :path: "../node_modules/react-native-fast-image" + RNFBApp: + :path: "../node_modules/@react-native-firebase/app" + RNFBMessaging: + :path: "../node_modules/@react-native-firebase/messaging" RNFileViewer: :path: "../node_modules/react-native-file-viewer" RNFS: @@ -937,28 +1001,30 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: boost: 7dcd2de282d72e344012f7d6564d024930a6a440 - CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 FBLazyVector: f91d538f197fa71a7d5b77ec2069d49550c0eb96 FBReactNativeSpec: b13d1c23d6ed82d6b66aad7a253edf8ba76c4a4c ffmpeg-kit-ios-audio: 6eaf5a3c4249b767328502747a08bfd901a86d3d ffmpeg-kit-react-native: 56ecfcd21536379dd123eade87c3b6fd55f12030 - Flipper: 6edb735e6c3e332975d1b17956bcc584eccf5818 - Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c - Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30 - Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b - Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3 - Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446 - Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 - FlipperKit: 2efad7007d6745a3f95e4034d547be637f89d3f6 + Firebase: cf09623f98ae25a3ad484e23c7e0e5f464152d80 + FirebaseAnalytics: fd35d51e6da86ef1aa2c3fe1f64ab2482cc01ba5 + FirebaseCore: c43f9f0437b50a965e930cac4ad243200d12a984 + FirebaseCoreExtension: cb88851781a24e031d1b58e0bd01eb1f46b044b5 + FirebaseCoreInternal: 6a292e6f0bece1243a737e81556e56e5e19282e3 + FirebaseInstallations: 42d6ead4605d6eafb3b6683674e80e18eb6f2c35 + FirebaseMessaging: 1b2270e66c81bbf184f70184db1d6a736ad0def5 fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + GoogleAppMeasurement: 794d1d2f71fdf77a077a3986258a5c2dac0f9d48 + GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a + GoogleUtilities: d053d902a8edaa9904e1bd00c37535385b8ed152 hermes-engine: 90e4033deb00bee33330a9f15eff0f874bd82f6d JitsiWebRTC: 3a41671ef65a51d7204323814b055a2690b921c7 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 + nanopb: 438bc412db1928dac798aa6fd75726007be04262 OneSignalXCFramework: ff1c970b7aeb4ac0fe48fb35393eb5d8bf378135 - OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 RCTRequired: b4d3068afa6f52ec5260a8417053b1f1b421483d RCTTypeSafety: a4551b3d338c96435f63bf06d564055c1d3cc0ac @@ -1010,6 +1076,7 @@ SPEC CHECKSUMS: React-utils: 372b83030a74347331636909278bf0a60ec30d59 ReactCommon: 38824bfffaf4c51fbe03a2730b4fd874ef34d67b ReactNativeExceptionHandler: b11ff67c78802b2f62eed0e10e75cb1ef7947c60 + ReactNativeIncallManager: bfc9c67358cd524882a7c4116dcb311ac2293d4b rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba RNAudioRecorderPlayer: f790fc1afb118552ae6285d60adde52ee6b5d9ef RNCallKeep: aa9b1f9286f8f60d7b7d41ee5de47de564356aac @@ -1019,6 +1086,8 @@ SPEC CHECKSUMS: RNDateTimePicker: fc2e4f2795877d45e84d85659bebe627eba5c931 RNDeviceInfo: db5c64a060e66e5db3102d041ebe3ef307a85120 RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8 + RNFBApp: 5cbbb49393dc840f46b227ae483d11d502ed36a8 + RNFBMessaging: f5ed5b4ef1b17f946b785cb7fa0d8d555a5e12b2 RNFileViewer: ce7ca3ac370e18554d35d6355cffd7c30437c592 RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 RNGestureHandler: 7909c50383a18f0cb10ce1db7262b9a6da504c03 @@ -1036,10 +1105,9 @@ SPEC CHECKSUMS: SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 - TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 + TOCropViewController: bf38459e9da6efe414de22087ebd5c530640f4bd Yoga: d0003f849d2b5224c072cef6568b540d8bb15cd3 - YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: cfc20c55adde2f7a0a48df5c2ebe42052a891ffa +PODFILE CHECKSUM: 3a44448b547a3316bb952755f0a413dd0086c662 COCOAPODS: 1.15.2 diff --git a/ios/taskme2-Bridging-Header.h b/ios/taskme2-Bridging-Header.h new file mode 100644 index 0000000..f9917fb --- /dev/null +++ b/ios/taskme2-Bridging-Header.h @@ -0,0 +1,12 @@ +// +// taskme2-Bridging-Header.h +// taskme2 +// +// Created by mac on 14.04.2024. +// + +#ifndef taskme2_Bridging_Header_h +#define taskme2_Bridging_Header_h + + +#endif /* taskme2_Bridging_Header_h */ diff --git a/ios/taskme2.xcodeproj/project.pbxproj b/ios/taskme2.xcodeproj/project.pbxproj index 8718359..a4be64c 100644 --- a/ios/taskme2.xcodeproj/project.pbxproj +++ b/ios/taskme2.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 00E356F31AD99517003FC87E /* taskme2Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* taskme2Tests.m */; }; + 042ADAED2BC3FCEA0086A848 /* google-services.json in Resources */ = {isa = PBXBuildFile; fileRef = 042ADAEC2BC3FCE90086A848 /* google-services.json */; }; 0495CBE12BA221E800BF4228 /* CallKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0495CBE02BA221E800BF4228 /* CallKit.framework */; }; 0495CBE32BA221EF00BF4228 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0495CBE22BA221EF00BF4228 /* Intents.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 04FBB34C2A84CD0D00436C19 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FBB34B2A84CD0D00436C19 /* NotificationService.swift */; }; @@ -15,15 +16,15 @@ 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 331EB3F0DD322F0D1B2DA16C /* libPods-taskme2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FD9FA6914F2DA8781CBD173 /* libPods-taskme2.a */; }; 3B650248E4D64E35864131AF /* fontello.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6D174334360E40AEAC86E003 /* fontello.ttf */; }; - 3DBB925B2361D8734B3BF05F /* libPods-OneSignalNotificationServiceExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A86FA5C0ED15EDDDD22D2FCF /* libPods-OneSignalNotificationServiceExtension.a */; }; - 41B967CD27101BB7DAE20A1F /* libPods-taskme2-taskme2Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 527F61C1DD2E37B4CB3A2F5C /* libPods-taskme2-taskme2Tests.a */; }; 488D245C87834B1F85544010 /* Gilroy-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 36EEF9A60D044056856CEEA6 /* Gilroy-Semibold.ttf */; }; + 6A5616D21302CF9D1D9BD3F6 /* libPods-taskme2-taskme2Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2CBCACA16ADDD21920623ED9 /* libPods-taskme2-taskme2Tests.a */; }; 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; B6F06B90F1F9411EBC065716 /* Gilroy-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = D66CD33E4DEC4377944DC7F7 /* Gilroy-Regular.ttf */; }; + B7ADE3E710FA3434D124892E /* libPods-OneSignalNotificationServiceExtension.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 762401719B7FB753E882DCF3 /* libPods-OneSignalNotificationServiceExtension.a */; }; BDD027C722014B7D83628596 /* Gilroy-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 00646ADD69A349E186C66A91 /* Gilroy-Bold.ttf */; }; CDBA011E492A49758920E896 /* Gilroy-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B25C228D4A644A728CA3561E /* Gilroy-Medium.ttf */; }; + DA7F8DFBC743EB75601E61BB /* libPods-taskme2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6C5ADA4DC3819471B7B74793 /* libPods-taskme2.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,6 +63,9 @@ 00E356EE1AD99517003FC87E /* taskme2Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = taskme2Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 00E356F21AD99517003FC87E /* taskme2Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = taskme2Tests.m; sourceTree = ""; }; + 042ADAEC2BC3FCE90086A848 /* google-services.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = "google-services.json"; path = "../android/app/google-services.json"; sourceTree = ""; }; + 046E5DB62BCC260B0029BAA1 /* taskme2Stage.Debug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = taskme2Stage.Debug.entitlements; path = taskme2/taskme2Stage.Debug.entitlements; sourceTree = ""; }; + 046E5DB92BCC47000029BAA1 /* taskme2-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "taskme2-Bridging-Header.h"; sourceTree = ""; }; 0495CBE02BA221E800BF4228 /* CallKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CallKit.framework; path = System/Library/Frameworks/CallKit.framework; sourceTree = SDKROOT; }; 0495CBE22BA221EF00BF4228 /* Intents.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Intents.framework; path = System/Library/Frameworks/Intents.framework; sourceTree = SDKROOT; }; 04D8E49A2B0BA79200ACC6E2 /* OneSignalNotificationServiceExtensionStage.Release.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OneSignalNotificationServiceExtensionStage.Release.entitlements; sourceTree = ""; }; @@ -71,33 +75,33 @@ 04FBB34B2A84CD0D00436C19 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 04FBB34D2A84CD0D00436C19 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 04FBB3552A84CDFA00436C19 /* OneSignalNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = OneSignalNotificationServiceExtension.entitlements; sourceTree = ""; }; - 08D358D544954D5B56BAFFAC /* Pods-taskme2-taskme2Tests.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.stage.debug.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.stage.debug.xcconfig"; sourceTree = ""; }; - 0AC2880E5264076073DF865D /* Pods-taskme2-taskme2Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.release.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.release.xcconfig"; sourceTree = ""; }; - 0FD9FA6914F2DA8781CBD173 /* libPods-taskme2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-taskme2.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 127996D261A12456ADB5A870 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; + 0AC17DF4CF0C564BE59C0EDD /* Pods-taskme2.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.release.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.release.xcconfig"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* taskme2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = taskme2.app; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = taskme2/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = taskme2/AppDelegate.mm; sourceTree = ""; }; 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = taskme2/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = taskme2/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = taskme2/main.m; sourceTree = ""; }; + 14A2E94F8D2D1BA9A6E1875C /* Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig"; sourceTree = ""; }; + 1EA249EED67750313BC0DD79 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig"; sourceTree = ""; }; + 2CBCACA16ADDD21920623ED9 /* libPods-taskme2-taskme2Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-taskme2-taskme2Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 36EED598BB7BB88F580BBFED /* Pods-taskme2-taskme2Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.debug.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.debug.xcconfig"; sourceTree = ""; }; 36EEF9A60D044056856CEEA6 /* Gilroy-Semibold.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Gilroy-Semibold.ttf"; path = "../src/assets/fonts/Gilroy-Semibold.ttf"; sourceTree = ""; }; - 527F61C1DD2E37B4CB3A2F5C /* libPods-taskme2-taskme2Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-taskme2-taskme2Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 625CB8CD85666B1AC0D40D6F /* Pods-taskme2.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.stage.release.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.stage.release.xcconfig"; sourceTree = ""; }; + 6683BBE85B183B391031BAE0 /* Pods-taskme2.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.stage.debug.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.stage.debug.xcconfig"; sourceTree = ""; }; + 681CCE6F9C35606AD2E75A94 /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.stage.release.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.stage.release.xcconfig"; sourceTree = ""; }; + 6C5ADA4DC3819471B7B74793 /* libPods-taskme2.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-taskme2.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6D174334360E40AEAC86E003 /* fontello.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = fontello.ttf; path = ../src/assets/fonts/fontello.ttf; sourceTree = ""; }; - 6D9AB5D106199D173D35A220 /* Pods-taskme2.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.debug.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.debug.xcconfig"; sourceTree = ""; }; - 73C040992F14443E396EB91F /* Pods-taskme2.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.release.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.release.xcconfig"; sourceTree = ""; }; - 7B57C84A260CC1F37F7723E8 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig"; sourceTree = ""; }; + 762401719B7FB753E882DCF3 /* libPods-OneSignalNotificationServiceExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OneSignalNotificationServiceExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7E1E35DC0A2178CF3D6329F1 /* Pods-taskme2-taskme2Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.release.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.release.xcconfig"; sourceTree = ""; }; 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = taskme2/LaunchScreen.storyboard; sourceTree = ""; }; - 821D0F756B605E607EC149FE /* Pods-taskme2-taskme2Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.debug.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.debug.xcconfig"; sourceTree = ""; }; - 878DA92B557C81DAFFCEF3BA /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; - A86FA5C0ED15EDDDD22D2FCF /* libPods-OneSignalNotificationServiceExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OneSignalNotificationServiceExtension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8836972E3579A6C0C8AFA2CB /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; + 8C020F736C286F3632F7133A /* Pods-taskme2.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.stage.release.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.stage.release.xcconfig"; sourceTree = ""; }; + 8EAFD587A49401F4A9B047A4 /* Pods-taskme2.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.debug.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.debug.xcconfig"; sourceTree = ""; }; + 8F4DD1A1D2C39811661D2BC9 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; + AEFD8315F04EAB58EA0B7902 /* Pods-taskme2-taskme2Tests.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.stage.debug.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.stage.debug.xcconfig"; sourceTree = ""; }; B25C228D4A644A728CA3561E /* Gilroy-Medium.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Gilroy-Medium.ttf"; path = "../src/assets/fonts/Gilroy-Medium.ttf"; sourceTree = ""; }; - CE34B284F5419976E086BB2A /* Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig"; path = "Target Support Files/Pods-OneSignalNotificationServiceExtension/Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig"; sourceTree = ""; }; D66CD33E4DEC4377944DC7F7 /* Gilroy-Regular.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "Gilroy-Regular.ttf"; path = "../src/assets/fonts/Gilroy-Regular.ttf"; sourceTree = ""; }; - E17C446E92AE22D017263DBA /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2-taskme2Tests.stage.release.xcconfig"; path = "Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests.stage.release.xcconfig"; sourceTree = ""; }; ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; - FE3A727783B541D29D3F1C9F /* Pods-taskme2.stage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-taskme2.stage.debug.xcconfig"; path = "Target Support Files/Pods-taskme2/Pods-taskme2.stage.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -105,7 +109,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 41B967CD27101BB7DAE20A1F /* libPods-taskme2-taskme2Tests.a in Frameworks */, + 6A5616D21302CF9D1D9BD3F6 /* libPods-taskme2-taskme2Tests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -113,7 +117,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3DBB925B2361D8734B3BF05F /* libPods-OneSignalNotificationServiceExtension.a in Frameworks */, + B7ADE3E710FA3434D124892E /* libPods-OneSignalNotificationServiceExtension.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -123,7 +127,7 @@ files = ( 0495CBE32BA221EF00BF4228 /* Intents.framework in Frameworks */, 0495CBE12BA221E800BF4228 /* CallKit.framework in Frameworks */, - 331EB3F0DD322F0D1B2DA16C /* libPods-taskme2.a in Frameworks */, + DA7F8DFBC743EB75601E61BB /* libPods-taskme2.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -161,6 +165,8 @@ 13B07FAE1A68108700A75B9A /* taskme2 */ = { isa = PBXGroup; children = ( + 046E5DB62BCC260B0029BAA1 /* taskme2Stage.Debug.entitlements */, + 042ADAEC2BC3FCE90086A848 /* google-services.json */, 04D8E49B2B0BA7BA00ACC6E2 /* taskme2Stage.Release.entitlements */, 04FBB3442A84CC6700436C19 /* taskme2.entitlements */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, @@ -191,9 +197,9 @@ 0495CBE22BA221EF00BF4228 /* Intents.framework */, 0495CBE02BA221E800BF4228 /* CallKit.framework */, ED297162215061F000B7C4FE /* JavaScriptCore.framework */, - 0FD9FA6914F2DA8781CBD173 /* libPods-taskme2.a */, - 527F61C1DD2E37B4CB3A2F5C /* libPods-taskme2-taskme2Tests.a */, - A86FA5C0ED15EDDDD22D2FCF /* libPods-OneSignalNotificationServiceExtension.a */, + 762401719B7FB753E882DCF3 /* libPods-OneSignalNotificationServiceExtension.a */, + 6C5ADA4DC3819471B7B74793 /* libPods-taskme2.a */, + 2CBCACA16ADDD21920623ED9 /* libPods-taskme2-taskme2Tests.a */, ); name = Frameworks; sourceTree = ""; @@ -208,6 +214,7 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 046E5DB92BCC47000029BAA1 /* taskme2-Bridging-Header.h */, 13B07FAE1A68108700A75B9A /* taskme2 */, 832341AE1AAA6A7D00B99B32 /* Libraries */, 00E356EF1AD99517003FC87E /* taskme2Tests */, @@ -235,18 +242,18 @@ BBD78D7AC51CEA395F1C20DB /* Pods */ = { isa = PBXGroup; children = ( - 6D9AB5D106199D173D35A220 /* Pods-taskme2.debug.xcconfig */, - 73C040992F14443E396EB91F /* Pods-taskme2.release.xcconfig */, - 821D0F756B605E607EC149FE /* Pods-taskme2-taskme2Tests.debug.xcconfig */, - 0AC2880E5264076073DF865D /* Pods-taskme2-taskme2Tests.release.xcconfig */, - 127996D261A12456ADB5A870 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */, - 878DA92B557C81DAFFCEF3BA /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */, - 7B57C84A260CC1F37F7723E8 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */, - CE34B284F5419976E086BB2A /* Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig */, - 625CB8CD85666B1AC0D40D6F /* Pods-taskme2.stage.release.xcconfig */, - FE3A727783B541D29D3F1C9F /* Pods-taskme2.stage.debug.xcconfig */, - E17C446E92AE22D017263DBA /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */, - 08D358D544954D5B56BAFFAC /* Pods-taskme2-taskme2Tests.stage.debug.xcconfig */, + 8F4DD1A1D2C39811661D2BC9 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */, + 8836972E3579A6C0C8AFA2CB /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */, + 1EA249EED67750313BC0DD79 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */, + 8EAFD587A49401F4A9B047A4 /* Pods-taskme2.debug.xcconfig */, + 0AC17DF4CF0C564BE59C0EDD /* Pods-taskme2.release.xcconfig */, + 8C020F736C286F3632F7133A /* Pods-taskme2.stage.release.xcconfig */, + 36EED598BB7BB88F580BBFED /* Pods-taskme2-taskme2Tests.debug.xcconfig */, + 7E1E35DC0A2178CF3D6329F1 /* Pods-taskme2-taskme2Tests.release.xcconfig */, + 681CCE6F9C35606AD2E75A94 /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */, + 14A2E94F8D2D1BA9A6E1875C /* Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig */, + 6683BBE85B183B391031BAE0 /* Pods-taskme2.stage.debug.xcconfig */, + AEFD8315F04EAB58EA0B7902 /* Pods-taskme2-taskme2Tests.stage.debug.xcconfig */, ); path = Pods; sourceTree = ""; @@ -258,12 +265,12 @@ isa = PBXNativeTarget; buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "taskme2Tests" */; buildPhases = ( - A5DE24D79F33D432DF4B226D /* [CP] Check Pods Manifest.lock */, + 77BFDAEED4209D3227009B4B /* [CP] Check Pods Manifest.lock */, 00E356EA1AD99517003FC87E /* Sources */, 00E356EB1AD99517003FC87E /* Frameworks */, 00E356EC1AD99517003FC87E /* Resources */, - C02CAD0DF223CD1CDAE396D6 /* [CP] Embed Pods Frameworks */, - 064D19E25D6E401EB2248F3B /* [CP] Copy Pods Resources */, + E904D85E87A057ECD764E1D0 /* [CP] Embed Pods Frameworks */, + 37EE953DC1E3E8F4ACA1154C /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -279,7 +286,7 @@ isa = PBXNativeTarget; buildConfigurationList = 04FBB3512A84CD0D00436C19 /* Build configuration list for PBXNativeTarget "OneSignalNotificationServiceExtension" */; buildPhases = ( - C3B0097ABC141CAB3164805B /* [CP] Check Pods Manifest.lock */, + 7F8952ECA5A62FDCBF810E6E /* [CP] Check Pods Manifest.lock */, 04FBB3452A84CD0D00436C19 /* Sources */, 04FBB3462A84CD0D00436C19 /* Frameworks */, 04FBB3472A84CD0D00436C19 /* Resources */, @@ -297,15 +304,16 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "taskme2" */; buildPhases = ( - C70469C45B82A08695475397 /* [CP] Check Pods Manifest.lock */, + 9F111EC59A14F057421BB1C8 /* [CP] Check Pods Manifest.lock */, FD10A7F022414F080027D42C /* Start Packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - F6DF47B7E17A0C6FFB685404 /* [CP] Embed Pods Frameworks */, - 82D11052B26BBE7B04DCAD66 /* [CP] Copy Pods Resources */, 04FBB3542A84CD0D00436C19 /* Embed Foundation Extensions */, + 8265AB58CB0D8EF5F6476DBE /* [CP] Embed Pods Frameworks */, + 0633F6B312E64E82A4F58621 /* [CP] Copy Pods Resources */, + 27A3BF627F6908DC09170CEC /* [CP-User] [RNFB] Core Configuration */, ); buildRules = ( ); @@ -379,6 +387,7 @@ files = ( 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 042ADAED2BC3FCEA0086A848 /* google-services.json in Resources */, BDD027C722014B7D83628596 /* Gilroy-Bold.ttf in Resources */, CDBA011E492A49758920E896 /* Gilroy-Medium.ttf in Resources */, B6F06B90F1F9411EBC065716 /* Gilroy-Regular.ttf in Resources */, @@ -406,41 +415,54 @@ shellPath = /bin/sh; shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; - 064D19E25D6E401EB2248F3B /* [CP] Copy Pods Resources */ = { + 0633F6B312E64E82A4F58621 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources.sh\"\n"; showEnvVarsInLog = 0; }; - 82D11052B26BBE7B04DCAD66 /* [CP] Copy Pods Resources */ = { + 27A3BF627F6908DC09170CEC /* [CP-User] [RNFB] Core Configuration */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + ); + name = "[CP-User] [RNFB] Core Configuration"; + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##########################################################################\n##########################################################################\n#\n# NOTE THAT IF YOU CHANGE THIS FILE YOU MUST RUN pod install AFTERWARDS\n#\n# This file is installed as an Xcode build script in the project file\n# by cocoapods, and you will not see your changes until you pod install\n#\n##########################################################################\n##########################################################################\n\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -Ku -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_analytics_storage\n _ANALYTICS_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_analytics_storage\")\n if [[ $_ANALYTICS_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_storage\n _ANALYTICS_AD_STORAGE=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_storage\")\n if [[ $_ANALYTICS_AD_STORAGE ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_STORAGE\")\")\n fi\n\n # config.analytics_default_allow_ad_user_data\n _ANALYTICS_AD_USER_DATA=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_user_data\")\n if [[ $_ANALYTICS_AD_USER_DATA ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AD_USER_DATA\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.analytics_registration_with_ad_network_enabled\n _ANALYTICS_REGISTRATION_WITH_AD_NETWORK=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_registration_with_ad_network_enabled\")\n if [[ $_ANALYTICS_REGISTRATION_WITH_AD_NETWORK ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_REGISTRATION_WITH_AD_NETWORK_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_REGISTRATION_WITH_AD_NETWORK\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n"; + }; + 37EE953DC1E3E8F4ACA1154C /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-resources.sh\"\n"; showEnvVarsInLog = 0; }; - A5DE24D79F33D432DF4B226D /* [CP] Check Pods Manifest.lock */ = { + 77BFDAEED4209D3227009B4B /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -462,46 +484,46 @@ 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; }; - C02CAD0DF223CD1CDAE396D6 /* [CP] Embed Pods Frameworks */ = { + 7F8952ECA5A62FDCBF810E6E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-OneSignalNotificationServiceExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks.sh\"\n"; + 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; }; - C3B0097ABC141CAB3164805B /* [CP] Check Pods Manifest.lock */ = { + 8265AB58CB0D8EF5F6476DBE /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-OneSignalNotificationServiceExtension-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); 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"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - C70469C45B82A08695475397 /* [CP] Check Pods Manifest.lock */ = { + 9F111EC59A14F057421BB1C8 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -523,21 +545,21 @@ 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; }; - F6DF47B7E17A0C6FFB685404 /* [CP] Embed Pods Frameworks */ = { + E904D85E87A057ECD764E1D0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2/Pods-taskme2-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-taskme2-taskme2Tests/Pods-taskme2-taskme2Tests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; FD10A7F022414F080027D42C /* Start Packager */ = { @@ -605,7 +627,7 @@ /* Begin XCBuildConfiguration section */ 00E356F61AD99517003FC87E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 821D0F756B605E607EC149FE /* Pods-taskme2-taskme2Tests.debug.xcconfig */; + baseConfigurationReference = 36EED598BB7BB88F580BBFED /* Pods-taskme2-taskme2Tests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -632,7 +654,7 @@ }; 00E356F71AD99517003FC87E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0AC2880E5264076073DF865D /* Pods-taskme2-taskme2Tests.release.xcconfig */; + baseConfigurationReference = 7E1E35DC0A2178CF3D6329F1 /* Pods-taskme2-taskme2Tests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; @@ -654,6 +676,294 @@ }; name = Release; }; + 046E5DB22BCC25D80029BAA1 /* Stage.Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = 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_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_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION, + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + OTHER_LDFLAGS = "$(inherited) "; + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + }; + name = Stage.Debug; + }; + 046E5DB32BCC25D80029BAA1 /* Stage.Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6683BBE85B183B391031BAE0 /* Pods-taskme2.stage.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = taskme2/taskme2Stage.Debug.entitlements; + CURRENT_PROJECT_VERSION = 28; + DEVELOPMENT_TEAM = HQ3J3TDPR2; + ENABLE_BITCODE = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/CocoaAsyncSocket\"", + "\"${PODS_ROOT}/Headers/Public/DoubleConversion\"", + "\"${PODS_ROOT}/Headers/Public/FBLazyVector\"", + "\"${PODS_ROOT}/Headers/Public/Flipper\"", + "\"${PODS_ROOT}/Headers/Public/Flipper-Fmt\"", + "\"${PODS_ROOT}/Headers/Public/Flipper-Folly\"", + "\"${PODS_ROOT}/Headers/Public/Flipper-PeerTalk\"", + "\"${PODS_ROOT}/Headers/Public/FlipperKit\"", + "\"${PODS_ROOT}/Headers/Public/RCT-Folly\"", + "\"${PODS_ROOT}/Headers/Public/RCTRequired\"", + "\"${PODS_ROOT}/Headers/Public/RCTTypeSafety\"", + "\"${PODS_ROOT}/Headers/Public/RNAudioRecorderPlayer\"", + "\"${PODS_ROOT}/Headers/Public/RNCAsyncStorage\"", + "\"${PODS_ROOT}/Headers/Public/RNCClipboard\"", + "\"${PODS_ROOT}/Headers/Public/RNCPicker\"", + "\"${PODS_ROOT}/Headers/Public/RNCallKeep\"", + "\"${PODS_ROOT}/Headers/Public/RNDateTimePicker\"", + "\"${PODS_ROOT}/Headers/Public/RNDeviceInfo\"", + "\"${PODS_ROOT}/Headers/Public/RNFS\"", + "\"${PODS_ROOT}/Headers/Public/RNFastImage\"", + "\"${PODS_ROOT}/Headers/Public/RNFileViewer\"", + "\"${PODS_ROOT}/Headers/Public/RNGestureHandler\"", + "\"${PODS_ROOT}/Headers/Public/RNImageCropPicker\"", + "\"${PODS_ROOT}/Headers/Public/RNNotifee\"", + "\"${PODS_ROOT}/Headers/Public/RNPDF\"", + "\"${PODS_ROOT}/Headers/Public/RNPermissions\"", + "\"${PODS_ROOT}/Headers/Public/RNReanimated\"", + "\"${PODS_ROOT}/Headers/Public/RNSVG\"", + "\"${PODS_ROOT}/Headers/Public/RNScreens\"", + "\"${PODS_ROOT}/Headers/Public/RNShare\"", + "\"${PODS_ROOT}/Headers/Public/RNSoundLevel\"", + "\"${PODS_ROOT}/Headers/Public/RNVectorIcons\"", + "\"${PODS_ROOT}/Headers/Public/React-Codegen\"", + "\"${PODS_ROOT}/Headers/Public/React-Core\"", + "\"${PODS_ROOT}/Headers/Public/React-NativeModulesApple\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAnimation\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTAppDelegate\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTBlob\"", + "\"${PODS_ROOT}/Headers/Public/React-RCTText\"", + "\"${PODS_ROOT}/Headers/Public/React-callinvoker\"", + "\"${PODS_ROOT}/Headers/Public/React-cxxreact\"", + "\"${PODS_ROOT}/Headers/Public/React-debug\"", + "\"${PODS_ROOT}/Headers/Public/React-hermes\"", + "\"${PODS_ROOT}/Headers/Public/React-jsi\"", + "\"${PODS_ROOT}/Headers/Public/React-jsiexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-jsinspector\"", + "\"${PODS_ROOT}/Headers/Public/React-logger\"", + "\"${PODS_ROOT}/Headers/Public/React-perflogger\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimeexecutor\"", + "\"${PODS_ROOT}/Headers/Public/React-runtimescheduler\"", + "\"${PODS_ROOT}/Headers/Public/React-utils\"", + "\"${PODS_ROOT}/Headers/Public/ReactCommon\"", + "\"${PODS_ROOT}/Headers/Public/ReactNativeExceptionHandler\"", + "\"${PODS_ROOT}/Headers/Public/SDWebImage\"", + "\"${PODS_ROOT}/Headers/Public/SDWebImageWebPCoder\"", + "\"${PODS_ROOT}/Headers/Public/SocketRocket\"", + "\"${PODS_ROOT}/Headers/Public/TOCropViewController\"", + "\"${PODS_ROOT}/Headers/Public/Yoga\"", + "\"${PODS_ROOT}/Headers/Public/YogaKit\"", + "\"${PODS_ROOT}/Headers/Public/ffmpeg-kit-react-native\"", + "\"${PODS_ROOT}/Headers/Public/fmt\"", + "\"${PODS_ROOT}/Headers/Public/glog\"", + "\"${PODS_ROOT}/Headers/Public/hermes-engine\"", + "\"${PODS_ROOT}/Headers/Public/libevent\"", + "\"${PODS_ROOT}/Headers/Public/libwebp\"", + "\"${PODS_ROOT}/Headers/Public/react-native-cameraroll\"", + "\"${PODS_ROOT}/Headers/Public/react-native-config\"", + "\"${PODS_ROOT}/Headers/Public/react-native-date-picker\"", + "\"${PODS_ROOT}/Headers/Public/react-native-document-picker\"", + "\"${PODS_ROOT}/Headers/Public/react-native-html-to-pdf\"", + "\"${PODS_ROOT}/Headers/Public/react-native-image-picker\"", + "\"${PODS_ROOT}/Headers/Public/react-native-netinfo\"", + "\"${PODS_ROOT}/Headers/Public/react-native-onesignal\"", + "\"${PODS_ROOT}/Headers/Public/react-native-pager-view\"", + "\"${PODS_ROOT}/Headers/Public/react-native-print\"", + "\"${PODS_ROOT}/Headers/Public/react-native-receive-sharing-intent\"", + "\"${PODS_ROOT}/Headers/Public/react-native-restart\"", + "\"${PODS_ROOT}/Headers/Public/react-native-safe-area-context\"", + "\"${PODS_ROOT}/Headers/Public/react-native-splash-screen\"", + "\"${PODS_ROOT}/Headers/Public/react-native-sqlite-storage\"", + "\"${PODS_ROOT}/Headers/Public/react-native-video\"", + "\"${PODS_ROOT}/Headers/Public/react-native-webrtc\"", + "\"${PODS_ROOT}/Headers/Public/react-native-webview\"", + "\"${PODS_ROOT}/Headers/Public/rn-fetch-blob\"", + "\"$(PODS_ROOT)/DoubleConversion\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost\"", + "\"$(PODS_ROOT)/boost-for-react-native\"", + "\"$(PODS_ROOT)/glog\"", + "\"$(PODS_ROOT)/RCT-Folly\"", + "\"$(PODS_ROOT)/Headers/Public/React-hermes\"", + "\"$(PODS_ROOT)/Headers/Public/hermes-engine\"", + "\"$(PODS_ROOT)/../../node_modules/react-native/ReactCommon\"", + "\"$(PODS_ROOT)/Headers/Private/React-Core\"", + "\"$(PODS_TARGET_SRCROOT)/include/\"", + "\"$(SRCROOT)/../node_modules/react-native-callkeep/ios/RNCallKeep\"", + ); + INFOPLIST_FILE = taskme2/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "Task me ;)"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 2.3; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.app.taskme.stage; + PRODUCT_NAME = taskme2; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_OBJC_BRIDGING_HEADER = "taskme2-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Stage.Debug; + }; + 046E5DB42BCC25D80029BAA1 /* Stage.Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AEFD8315F04EAB58EA0B7902 /* Pods-taskme2-taskme2Tests.stage.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = taskme2Tests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/taskme2.app/taskme2"; + }; + name = Stage.Debug; + }; + 046E5DB52BCC25D80029BAA1 /* Stage.Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 14A2E94F8D2D1BA9A6E1875C /* Pods-OneSignalNotificationServiceExtension.stage.debug.xcconfig */; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = OneSignalNotificationServiceExtension/OneSignalNotificationServiceExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = HQ3J3TDPR2; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = OneSignalNotificationServiceExtension/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = OneSignalNotificationServiceExtension; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 2.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.app.taskme.OneSignalNotificationServiceExtension; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Stage.Debug; + }; 04D8E4962B0BA3EF00ACC6E2 /* Stage.Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -700,6 +1010,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, @@ -727,14 +1045,14 @@ }; 04D8E4972B0BA3EF00ACC6E2 /* Stage.Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 625CB8CD85666B1AC0D40D6F /* Pods-taskme2.stage.release.xcconfig */; + baseConfigurationReference = 8C020F736C286F3632F7133A /* Pods-taskme2.stage.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = taskme2/taskme2Stage.Release.entitlements; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = HQ3J3TDPR2; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -863,7 +1181,7 @@ }; 04D8E4982B0BA3EF00ACC6E2 /* Stage.Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E17C446E92AE22D017263DBA /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */; + baseConfigurationReference = 681CCE6F9C35606AD2E75A94 /* Pods-taskme2-taskme2Tests.stage.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; @@ -887,7 +1205,7 @@ }; 04D8E4992B0BA3EF00ACC6E2 /* Stage.Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7B57C84A260CC1F37F7723E8 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */; + baseConfigurationReference = 1EA249EED67750313BC0DD79 /* Pods-OneSignalNotificationServiceExtension.stage.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -927,7 +1245,7 @@ }; 04FBB3522A84CD0D00436C19 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 127996D261A12456ADB5A870 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */; + baseConfigurationReference = 8F4DD1A1D2C39811661D2BC9 /* Pods-OneSignalNotificationServiceExtension.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -967,7 +1285,7 @@ }; 04FBB3532A84CD0D00436C19 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 878DA92B557C81DAFFCEF3BA /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */; + baseConfigurationReference = 8836972E3579A6C0C8AFA2CB /* Pods-OneSignalNotificationServiceExtension.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1007,14 +1325,14 @@ }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6D9AB5D106199D173D35A220 /* Pods-taskme2.debug.xcconfig */; + baseConfigurationReference = 8EAFD587A49401F4A9B047A4 /* Pods-taskme2.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = taskme2/taskme2.entitlements; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = HQ3J3TDPR2; ENABLE_BITCODE = NO; HEADER_SEARCH_PATHS = ( @@ -1145,14 +1463,14 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 73C040992F14443E396EB91F /* Pods-taskme2.release.xcconfig */; + baseConfigurationReference = 0AC17DF4CF0C564BE59C0EDD /* Pods-taskme2.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = taskme2/taskme2.entitlements; - CURRENT_PROJECT_VERSION = 27; + CURRENT_PROJECT_VERSION = 28; DEVELOPMENT_TEAM = HQ3J3TDPR2; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -1329,6 +1647,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, @@ -1400,6 +1726,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, @@ -1432,6 +1766,7 @@ isa = XCConfigurationList; buildConfigurations = ( 00E356F61AD99517003FC87E /* Debug */, + 046E5DB42BCC25D80029BAA1 /* Stage.Debug */, 00E356F71AD99517003FC87E /* Release */, 04D8E4982B0BA3EF00ACC6E2 /* Stage.Release */, ); @@ -1442,6 +1777,7 @@ isa = XCConfigurationList; buildConfigurations = ( 04FBB3522A84CD0D00436C19 /* Debug */, + 046E5DB52BCC25D80029BAA1 /* Stage.Debug */, 04FBB3532A84CD0D00436C19 /* Release */, 04D8E4992B0BA3EF00ACC6E2 /* Stage.Release */, ); @@ -1452,6 +1788,7 @@ isa = XCConfigurationList; buildConfigurations = ( 13B07F941A680F5B00A75B9A /* Debug */, + 046E5DB32BCC25D80029BAA1 /* Stage.Debug */, 13B07F951A680F5B00A75B9A /* Release */, 04D8E4972B0BA3EF00ACC6E2 /* Stage.Release */, ); @@ -1462,6 +1799,7 @@ isa = XCConfigurationList; buildConfigurations = ( 83CBBA201A601CBA00E9B192 /* Debug */, + 046E5DB22BCC25D80029BAA1 /* Stage.Debug */, 83CBBA211A601CBA00E9B192 /* Release */, 04D8E4962B0BA3EF00ACC6E2 /* Stage.Release */, ); diff --git a/ios/taskme2.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/taskme2.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/ios/taskme2.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/ios/taskme2/taskme2Stage.Debug.entitlements b/ios/taskme2/taskme2Stage.Debug.entitlements new file mode 100644 index 0000000..e94a485 --- /dev/null +++ b/ios/taskme2/taskme2Stage.Debug.entitlements @@ -0,0 +1,17 @@ + + + + + aps-environment + development + com.apple.developer.associated-domains + + applinks:example.com + + com.apple.security.application-groups + + group.com.app.taskme + group.com.app.taskme.stage.onesignal + + + diff --git a/package-lock.json b/package-lock.json index 7a3d1d7..547c897 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,8 @@ "@react-native-community/clipboard": "^1.5.1", "@react-native-community/datetimepicker": "^7.6.2", "@react-native-community/netinfo": "^9.3.10", + "@react-native-firebase/app": "^19.1.2", + "@react-native-firebase/messaging": "^19.1.2", "@react-native-picker/picker": "^2.4.10", "@react-native/eslint-config": "^0.72.2", "@react-native/metro-config": "^0.72.11", @@ -63,6 +65,7 @@ "react-native-html-to-pdf": "^0.12.0", "react-native-image-crop-picker": "^0.40.0", "react-native-image-picker": "^5.6.0", + "react-native-incall-manager": "^4.2.0", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-masked-text": "^1.13.0", "react-native-modal": "^13.0.1", @@ -12351,6 +12354,14 @@ "react-native": "*" } }, + "node_modules/react-native-incall-manager": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-native-incall-manager/-/react-native-incall-manager-4.2.0.tgz", + "integrity": "sha512-DC5XRQVAwNgNA6YZ3ILF6ttWXv/MUQ4omzmVDh/uHc0TW0v4f8QIdt6D9GHZhGKb3+qB7XKUxpXVBrLH+9zqfQ==", + "peerDependencies": { + "react-native": ">=0.40.0" + } + }, "node_modules/react-native-iphone-x-helper": { "version": "1.3.1", "license": "MIT", @@ -22177,6 +22188,12 @@ "version": "5.7.0", "requires": {} }, + "react-native-incall-manager": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/react-native-incall-manager/-/react-native-incall-manager-4.2.0.tgz", + "integrity": "sha512-DC5XRQVAwNgNA6YZ3ILF6ttWXv/MUQ4omzmVDh/uHc0TW0v4f8QIdt6D9GHZhGKb3+qB7XKUxpXVBrLH+9zqfQ==", + "requires": {} + }, "react-native-iphone-x-helper": { "version": "1.3.1", "requires": {} diff --git a/package.json b/package.json index 5d96ad1..9c775e9 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "@react-native-community/clipboard": "^1.5.1", "@react-native-community/datetimepicker": "^7.6.2", "@react-native-community/netinfo": "^9.3.10", + "@react-native-firebase/app": "^19.1.2", + "@react-native-firebase/messaging": "^19.1.2", "@react-native-picker/picker": "^2.4.10", "@react-native/eslint-config": "^0.72.2", "@react-native/metro-config": "^0.72.11", @@ -73,6 +75,7 @@ "react-native-html-to-pdf": "^0.12.0", "react-native-image-crop-picker": "^0.40.0", "react-native-image-picker": "^5.6.0", + "react-native-incall-manager": "^4.2.0", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-masked-text": "^1.13.0", "react-native-modal": "^13.0.1", diff --git a/src/App.tsx b/src/App.tsx index 8e6df69..c843334 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -7,7 +7,7 @@ if (__DEV__) { } import { ThemeProvider } from './shared/themes' -import { AppState, LogBox, Platform } from 'react-native' +import { Alert, AppState, LogBox, Platform } from 'react-native' import { appService } from './services/app.service' import 'react-native-gesture-handler' import { BottomSheetModalProvider } from '@gorhom/bottom-sheet' @@ -19,12 +19,18 @@ import Toast from 'react-native-toast-message' import { toastConfig } from './config/toast.config' import { VoipNotificationsService } from './services/system' -import { callKeepService } from './modules/calls/services/callkeep.service' import './modules/calls/services/calls-events.service' +import { callKeepService } from './modules/calls/services/callkeep/callkeep' LogBox.ignoreLogs(['Warning: ...', 'Require cycle: ...']) LogBox.ignoreAllLogs() +if (Platform.OS === 'android') { + require('./modules/calls/services/callkeep-notifications-android.service') +} + +callKeepService.register() + const App: FC = () => { useEffect(() => { appService.initApp() @@ -47,14 +53,6 @@ const App: FC = () => { } }, []) - useEffect(() => { - // console.log(callsEventsService) - callKeepService.register() - return () => { - callKeepService.unregister() - } - }, []) - useEffect(() => { if (Platform.OS === 'ios') { VoipNotificationsService.getInstance().initListeners() diff --git a/src/api/calls/requests.ts b/src/api/calls/requests.ts index a842f19..38117d9 100644 --- a/src/api/calls/requests.ts +++ b/src/api/calls/requests.ts @@ -1,3 +1,4 @@ +import { ICall } from '@/shared' import api from '../http.service' import { IAnswerCallPayload, @@ -37,3 +38,11 @@ export const deleteCallHistoryReq = (callId: number) => { export const getIncomeDataReq = (callId: string, targetDeviceId: string) => { return api.post(`calls/income/${callId}`, { targetDeviceId }, {}, '') } + +export const sendNegotiationReq = (callId: string, payload: any) => { + return api.post(`calls/negotiation/${callId}`, payload, null, '') +} + +export const getCallReq = (callId: string) => { + return api.get(`calls/${callId}`, {}, '') +} diff --git a/src/api/notifications/requests.interfaces.ts b/src/api/notifications/requests.interfaces.ts index 48aea72..f346913 100644 --- a/src/api/notifications/requests.interfaces.ts +++ b/src/api/notifications/requests.interfaces.ts @@ -1,6 +1,6 @@ export interface ISaveDevicePayload { deviceUuid: string notificationUserId: string - isVoip?: boolean + type?: string isDev?: boolean } diff --git a/src/config/index.ts b/src/config/index.ts index 3833fb0..330c66b 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -7,6 +7,7 @@ export const dynamicConfig = { baseUrl: Config.API_URL, socketUrl: Config.SOCKET_URL, oneSignalKey: Config.ONE_SIGNAL_KEY, + appStoreUrl: 'https://apps.apple.com/ua/app/task-me/id1482240685?l=uk', googlePlayUrl: 'https://play.google.com/store/apps/details?id=com.app.task_me', diff --git a/src/modules/calls/hooks/use-call-data.hook.ts b/src/modules/calls/hooks/use-call-data.hook.ts index 19d8d19..e67cd21 100644 --- a/src/modules/calls/hooks/use-call-data.hook.ts +++ b/src/modules/calls/hooks/use-call-data.hook.ts @@ -17,6 +17,7 @@ export interface CallDataStore { remoteRTCMessage?: any icecandidates: any[] connectedStatus: RTCIceConnectionState + isIncomeCall?: boolean // true if device answering, false if device calling changeMod: (mod: CallMod) => void startCall: (targetUserId: number, peerConnection: RTCPeerConnection) => void @@ -67,6 +68,7 @@ export const useCallDataStore = create()(set => ({ remoteRTCMessage, mod: CallMod.Incoming, peerConnection, + isIncomeCall: true, }) }, diff --git a/src/modules/calls/hooks/use-call-status.hook.ts b/src/modules/calls/hooks/use-call-status.hook.ts index e0c880f..61917bb 100644 --- a/src/modules/calls/hooks/use-call-status.hook.ts +++ b/src/modules/calls/hooks/use-call-status.hook.ts @@ -1,16 +1,6 @@ import { useMemo } from 'react' import { useCallDataStore } from './use-call-data.hook' -const rtcStatusLabel: Record = { - new: "З'єднання", - checking: '', - closed: '', - completed: '', - disconnected: '', - failed: '', - connected: '', -} - export const useCallStatus = () => { const connectedStatus = useCallDataStore(s => s.connectedStatus) diff --git a/src/modules/calls/hooks/use-call-streams.hook.ts b/src/modules/calls/hooks/use-call-streams.hook.ts index dbc1b17..f47a0a1 100644 --- a/src/modules/calls/hooks/use-call-streams.hook.ts +++ b/src/modules/calls/hooks/use-call-streams.hook.ts @@ -2,13 +2,16 @@ import { useEffect, useMemo, useState } from 'react' import { MediaStream, mediaDevices } from 'react-native-webrtc' import { create } from 'zustand' import { peerConnectionService } from '../services' -import { useEventsListener } from '@/shared' - +import { appEvents, useEventsListener } from '@/shared' +import InCallManager from 'react-native-incall-manager' +import RNCallKeep from 'react-native-callkeep' +import { useCallDataStore } from './use-call-data.hook' export interface ICallStreamsStore { localStream: MediaStream remoteStream: MediaStream isMicOn: boolean isCameraOn: boolean + isSpeakerOn: boolean remoteVideoOn: boolean @@ -17,6 +20,7 @@ export interface ICallStreamsStore { setMicOn: (isMicOn: boolean) => void setCameraOn: (isCameraOn: boolean) => void setRemoveVideoOn: (removeVideoOn: boolean) => void + setSpeakerOn: (isSpeakerOn: boolean) => void } const callsStreamStore = create()(set => ({ @@ -25,6 +29,7 @@ const callsStreamStore = create()(set => ({ isMicOn: true, isCameraOn: true, remoteVideoOn: true, + isSpeakerOn: true, setLocalStream(localStream) { set({ localStream }) @@ -44,6 +49,10 @@ const callsStreamStore = create()(set => ({ setRemoveVideoOn(remoteVideoOn) { set({ remoteVideoOn }) }, + + setSpeakerOn(isSpeakerOn) { + set({ isSpeakerOn }) + }, })) export const useCallsStream = callsStreamStore @@ -70,30 +79,39 @@ export const initCallsMediaDevices = async (peerConnection: any) => { } export const useLocalStream = () => { - const localMicOn = callsStreamsCtr().isMicOn - const isCameraOn = callsStreamsCtr().isCameraOn - const localStream = callsStreamsCtr().localStream - - function toogleMic() { - callsStreamsCtr().setMicOn(!localMicOn) + const localMicOn = callsStreamStore(s => s.isMicOn) + const isCameraOn = callsStreamStore(s => s.isCameraOn) + const localStream = callsStreamStore(s => s.localStream) + + function toogleMic(value?: boolean, slientChange = false) { + const isOn = value ? value : !localMicOn + callsStreamsCtr().setMicOn(isOn) + console.log('isOne', isOn) localStream.getAudioTracks().forEach(track => { - localMicOn ? (track.enabled = false) : (track.enabled = true) + !isOn ? (track.enabled = false) : (track.enabled = true) }) peerConnectionService.sendMessage({ type: 'changeMicro', value: !localMicOn, }) + // if (!slientChange) { + // appEvents.emit('callSettingUpdated', {}) + // } } - function toogleCamera() { - callsStreamsCtr().setCameraOn(!isCameraOn) + function toogleCamera(value?: boolean, slientChange = false) { + const isOn = value ? value : !isCameraOn + callsStreamsCtr().setCameraOn(isOn) localStream.getVideoTracks().forEach(track => { - isCameraOn ? (track.enabled = false) : (track.enabled = true) + !isOn ? (track.enabled = false) : (track.enabled = true) }) peerConnectionService.sendMessage({ type: 'changeVideo', value: !isCameraOn, }) + // if (!slientChange) { + // appEvents.emit('callSettingUpdated', {}) + // } } return { @@ -110,9 +128,33 @@ export const useRemoteStream = () => { const remoteVideoOn = callsStreamStore(s => s.remoteVideoOn) useEventsListener('call-channel/changeVideo', ({ value }) => { - console.log('value', value) callsStreamsCtr().setRemoveVideoOn(value) }) return { isRemoteCameraOn: remoteVideoOn } } + +export const useAudioOutput = () => { + const isSpeakerOn = callsStreamStore(s => s.isSpeakerOn) + + useEffect(() => { + InCallManager.setForceSpeakerphoneOn(isSpeakerOn) + }, []) + + const toggleSpeaker = async () => { + try { + callsStreamsCtr().setSpeakerOn(!isSpeakerOn) + + InCallManager.setForceSpeakerphoneOn(!isSpeakerOn) + + appEvents.emit('callSettingUpdated', {}) + } catch (error) { + console.error('Error setting speaker mode:', error) + } + } + + return { + isSpeakerOn, + toggleSpeaker, + } +} diff --git a/src/modules/calls/screens/call/index.tsx b/src/modules/calls/screens/call/index.tsx index a60f0fe..2dbc1bd 100644 --- a/src/modules/calls/screens/call/index.tsx +++ b/src/modules/calls/screens/call/index.tsx @@ -3,6 +3,7 @@ import { CallingAtom, OutgoingcallAtom } from './atoms' import { Button } from '@/shared' import { CallMod, + useAudioOutput, useCallDataStore, useCallFromStore, useCallStatus, @@ -22,13 +23,12 @@ export const CallScreen = () => { const { title, avatarImageUrl } = useCallFromStore() const { label } = useCallStatus() const { toogleMic, localMicOn, isCameraOn, toogleCamera } = useLocalStream() + const { isSpeakerOn, toggleSpeaker } = useAudioOutput() const { isRemoteCameraOn } = useRemoteStream() const stopCall = () => { callService.stop() } - console.log('isRemoteCameraOn', isRemoteCameraOn) - const templates = { [CallMod.Speaking]: ( { toggleSpeaker()} iconColor="#000" style={styles.callBtn} /> @@ -61,7 +61,7 @@ export const CallScreen = () => { } bgColor="#fff" isAnimated={false} - onPress={toogleCamera} + onPress={() => toogleCamera()} iconColor="#000" style={styles.callBtn} /> @@ -69,7 +69,7 @@ export const CallScreen = () => { iconName={localMicOn ? 'microphone' : 'microphoneslash'} bgColor="#fff" isAnimated={false} - onPress={toogleMic} + onPress={() => toogleMic()} iconColor="#000" style={styles.callBtn} /> diff --git a/src/modules/calls/services/call.service.ts b/src/modules/calls/services/call.service.ts index de84276..6da0fb9 100644 --- a/src/modules/calls/services/call.service.ts +++ b/src/modules/calls/services/call.service.ts @@ -7,8 +7,7 @@ import { RouteKey } from '@/shared' import { StopCall } from '../core/stop-call' import { cancelCallReq } from '@/api/calls/requests' import { RTCSessionDescription } from 'react-native-webrtc' -import { callKeepService } from './callkeep.service' - +import { callKeepService } from './callkeep' class CallService extends CallRoot { public async proccesIncome(data: any) { const peerConnection = await peerConnectionService.createIns() diff --git a/src/modules/calls/services/callkeep-notifications-android.service.ts b/src/modules/calls/services/callkeep-notifications-android.service.ts new file mode 100644 index 0000000..63bce0e --- /dev/null +++ b/src/modules/calls/services/callkeep-notifications-android.service.ts @@ -0,0 +1,52 @@ +import messaging from '@react-native-firebase/messaging' +import RNCallKeep from 'react-native-callkeep' + +messaging().setBackgroundMessageHandler(async message => { + const data = message.data as any + + if (!data) { + return + } + + if (data?.type === 'callAnswered') { + RNCallKeep.endAllCalls() + return + } + + if (data?.uuid) { + RNCallKeep.displayIncomingCall( + data.uuid, + data.handle, + data.callerName, + 'number', + false, + ) + } +}) + +messaging().onMessage(async message => { + try { + const data = message.data as any + + if (!data) { + return + } + + if (data?.type === 'callAnswered') { + RNCallKeep.endAllCalls() + return + } + + if (data?.uuid) { + RNCallKeep.displayIncomingCall( + data.uuid, + data.handle, + data.callerName, + 'number', + false, + ) + } + } catch (e) { + console.log(e) + } +}) diff --git a/src/modules/calls/services/callkeep.service.ts b/src/modules/calls/services/callkeep.service.ts deleted file mode 100644 index fdd74a1..0000000 --- a/src/modules/calls/services/callkeep.service.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { getIncomeDataReq } from '@/api/calls/requests' -import RNCallKeep from 'react-native-callkeep' -import { CallRoot } from './call-root.service' -import { Platform } from 'react-native' -import { appEvents } from '@/shared' -import { DeviceInfoService } from '@/services/system' - -class CallKeepService extends CallRoot { - public register() { - this.init() - this.initListeners() - } - - public unregister() { - this.removeListeners() - } - - private async init() { - RNCallKeep.endAllCalls() - RNCallKeep.setup({ - ios: { - appName: 'TaskMe', - includesCallsInRecents: false, - maximumCallGroups: '1', - supportsVideo: false, - }, - android: { - alertTitle: 'Permissions required', - alertDescription: - 'This application needs to access your phone accounts', - cancelButton: 'Cancel', - okButton: 'ok', - imageName: 'phone_account_icon', - additionalPermissions: [], - foregroundService: { - channelId: 'com.company.my', - channelName: 'Foreground service for my app', - notificationTitle: 'My app is running on background', - notificationIcon: - 'Path to the resource icon of the notification', - }, - }, - }) - } - - private initListeners() { - RNCallKeep.addEventListener('answerCall', this.onAnswer.bind(this)) - RNCallKeep.addEventListener('endCall', this.onEnd.bind(this)) - RNCallKeep.addEventListener( - 'didPerformSetMutedCallAction', - this.changeMuted.bind(this), - ) - } - private removeListeners() { - RNCallKeep.clearInitialEvents() - RNCallKeep.removeEventListener('answerCall') - RNCallKeep.removeEventListener('endCall') - RNCallKeep.removeEventListener('didPerformSetMutedCallAction') - } - - private async onAnswer(data: any) { - try { - appEvents.emit('closeConfirmModal', {}) - - const id = await DeviceInfoService.getDeviceUniqueId() - getIncomeDataReq(data.callUUID, id) - } catch (e) { - console.log('Error on answer', e) - } - } - - private async onEnd() { - console.log('onend') - } - - private async changeMuted() { - console.log('changemuted') - } - - public async stop() { - RNCallKeep.endCall(this.store.callId) - RNCallKeep.endAllCalls() - } - - public async handleAcceptedIncomeInOtherDevice(uuid: string) { - RNCallKeep.rejectCall(uuid) - RNCallKeep.endAllCalls() - } -} - -export const callKeepService = new CallKeepService() diff --git a/src/modules/calls/services/callkeep/callkeep-android.service.ts b/src/modules/calls/services/callkeep/callkeep-android.service.ts new file mode 100644 index 0000000..b167dca --- /dev/null +++ b/src/modules/calls/services/callkeep/callkeep-android.service.ts @@ -0,0 +1,18 @@ +import RNCallKeep from 'react-native-callkeep' +import { CallKeepRootService } from './callkeep-root.service' + +export class CallkeepAndroidService extends CallKeepRootService { + protected async onAnswer(data: any) { + RNCallKeep.backToForeground() + RNCallKeep.setConnectionState(data.callUUID, 128) + await delay(100) + RNCallKeep.endAllCalls() + RNCallKeep.endCall(data.callUUID) + + super.onAnswer(data) + } +} + +function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} diff --git a/src/modules/calls/services/callkeep/callkeep-ios.service.ts b/src/modules/calls/services/callkeep/callkeep-ios.service.ts new file mode 100644 index 0000000..701477d --- /dev/null +++ b/src/modules/calls/services/callkeep/callkeep-ios.service.ts @@ -0,0 +1,3 @@ +import { CallKeepRootService } from './callkeep-root.service' + +export class CallkeepIosService extends CallKeepRootService {} diff --git a/src/modules/calls/services/callkeep/callkeep-root.service.ts b/src/modules/calls/services/callkeep/callkeep-root.service.ts new file mode 100644 index 0000000..54ba796 --- /dev/null +++ b/src/modules/calls/services/callkeep/callkeep-root.service.ts @@ -0,0 +1,149 @@ +import { getCallReq, getIncomeDataReq } from '@/api/calls/requests' +import RNCallKeep from 'react-native-callkeep' +import { CallStatus, appEvents } from '@/shared' +import { DeviceInfoService } from '@/services/system' +import { CallRoot } from '../call-root.service' +import { useLocalStream } from '../../hooks' + +export class CallKeepRootService extends CallRoot { + protected accountInited = false + protected waitingToAnswerData?: any + + public register() { + this.init() + this.initListeners() + } + + public unregister() { + this.removeListeners() + } + + protected async init() { + RNCallKeep.setup({ + ios: { + appName: 'TaskMe', + includesCallsInRecents: false, + maximumCallGroups: '1', + supportsVideo: false, + }, + android: { + alertTitle: 'Permissions required', + alertDescription: + 'This application needs to access your phone accounts', + cancelButton: 'Cancel', + okButton: 'ok', + imageName: 'phone_account_icon', + additionalPermissions: [], + foregroundService: { + channelId: 'com.company.my', + channelName: 'Foreground service for my app', + notificationTitle: 'My app is running on background', + notificationIcon: + 'Path to the resource icon of the notification', + }, + }, + }) + + RNCallKeep.endAllCalls() + } + + protected async initListeners() { + RNCallKeep.addEventListener('answerCall', this.onAnswer.bind(this)) + RNCallKeep.addEventListener('endCall', this.onEnd.bind(this)) + RNCallKeep.addEventListener( + 'didPerformSetMutedCallAction', + this.changeMuted.bind(this), + ) + RNCallKeep.addEventListener( + 'didDisplayIncomingCall', + this.onDisplayIncomingCal.bind(this), + ) + + appEvents.on('onAccountWasLoaded', () => { + this.accountInited = true + }) + + appEvents.on( + 'callSettingUpdated', + this.onCallSettingsUpdateByApp.bind(this), + ) + } + protected removeListeners() { + RNCallKeep.removeEventListener('answerCall') + RNCallKeep.removeEventListener('endCall') + RNCallKeep.removeEventListener('didPerformSetMutedCallAction') + } + + protected async onDisplayIncomingCal(data) { + const { data: call } = await getCallReq(data.callUUID) + + if (call.status !== CallStatus.New) { + RNCallKeep.endCall(data.callUUID) + } + } + + protected async onAnswer(data: any) { + const { data: call } = await getCallReq(data.callUUID) + if (call.status !== CallStatus.New) { + appEvents.emit('openInfoModal', { + title: 'Звінок вже завершився', + message: + 'Ініціатор скасував виклик або виклик був прийнятий на іншому девайсі', + }) + + RNCallKeep.endAllCalls() + + return + } + + if (!this.accountInited) { + this.waitingToAnswerData = data + } else { + await this.startAnswering(data) + } + } + + public async startAnswering(data?: any) { + const payload = data ? data : this.waitingToAnswerData + appEvents.emit('closeConfirmModal', {}) + + const id = await DeviceInfoService.getDeviceUniqueId() + await getIncomeDataReq(payload.callUUID, id) + } + + protected async onEnd() { + console.log('onend') + } + + protected async changeMuted({ muted }) { + console.log('changemuted', muted) + + // useLocalStream().toogleMic() + } + + protected async onCallSettingsUpdateByApp() { + console.log('UPDATED') + + const from = this.storeFrom.title + const callId = this.store.callId + + RNCallKeep.updateDisplay(callId, from, 'generic', { + hasVideo: this.streamsStore.isCameraOn, + }) + + RNCallKeep.setMutedCall(callId, this.streamsStore.isMicOn) + } + + public async stop() { + RNCallKeep.endCall(this.store.callId) + RNCallKeep.endAllCalls() + } + + public async handleAcceptedIncomeInOtherDevice(uuid: string) { + RNCallKeep.rejectCall(uuid) + RNCallKeep.endAllCalls() + } +} +function delay(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} diff --git a/src/modules/calls/services/callkeep/callkeep.ts b/src/modules/calls/services/callkeep/callkeep.ts new file mode 100644 index 0000000..5150b12 --- /dev/null +++ b/src/modules/calls/services/callkeep/callkeep.ts @@ -0,0 +1,9 @@ +import { Platform } from 'react-native' +import { CallkeepIosService } from './callkeep-ios.service' +import { CallkeepAndroidService } from './callkeep-android.service' +import { CallKeepRootService } from './callkeep-root.service' + +export const callKeepService = Platform.select({ + ios: new CallkeepIosService(), + android: new CallkeepAndroidService(), +}) diff --git a/src/modules/calls/services/callkeep/index.ts b/src/modules/calls/services/callkeep/index.ts new file mode 100644 index 0000000..ca40ed1 --- /dev/null +++ b/src/modules/calls/services/callkeep/index.ts @@ -0,0 +1 @@ +export * from './callkeep' diff --git a/src/modules/calls/services/calls-events.service.ts b/src/modules/calls/services/calls-events.service.ts index fabe46d..3e8011f 100644 --- a/src/modules/calls/services/calls-events.service.ts +++ b/src/modules/calls/services/calls-events.service.ts @@ -3,9 +3,10 @@ import { CallRoot } from './call-root.service' import { CallMod } from '../hooks' import { callService } from './call.service' import { DeviceInfoService, NavigationService } from '@/services/system' -import { Alert } from 'react-native' import { RTCIceCandidate, RTCSessionDescription } from 'react-native-webrtc' -import { callKeepService } from './callkeep.service' +import { callKeepService } from './callkeep' +import { peerConnectionService } from './peer-connection.service' +import RNCallKeep from 'react-native-callkeep' class CallsEventsService extends CallRoot { constructor() { @@ -15,9 +16,12 @@ class CallsEventsService extends CallRoot { private init() { socketEvents.on('call/answered', data => { + console.log('[answered]') this.store.peerConnection.setRemoteDescription( new RTCSessionDescription(data.rtcMessage), ) + + peerConnectionService.sendIcecandidates() this.store.changeMod(CallMod.Speaking) this.proccessIceCandidates() }) @@ -26,6 +30,17 @@ class CallsEventsService extends CallRoot { 'call/ICEcandidate', this.proccessIceCandidateEvent.bind(this), ) + socketEvents.on('call/negotiation', async data => { + this.store.peerConnection.setRemoteDescription(data.rtcMessage) + }) + + socketEvents.on('calls/answered-by-another-device', async data => { + console.log('calls/answered-by-another-device', data) + const deviceId = await DeviceInfoService.getDeviceUniqueId() + if (deviceId !== data.deviceUuid) { + RNCallKeep.endAllCalls() + } + }) } private proccessIceCandidates() { @@ -40,7 +55,6 @@ class CallsEventsService extends CallRoot { } private async proccessNewCall(data) { - console.log('procces new call', data) const id = await DeviceInfoService.getDeviceUniqueId() if (data.targetUserDeviceId !== id) { callKeepService.handleAcceptedIncomeInOtherDevice(data.callId) diff --git a/src/modules/calls/services/index.ts b/src/modules/calls/services/index.ts index 565a611..6c2a0c1 100644 --- a/src/modules/calls/services/index.ts +++ b/src/modules/calls/services/index.ts @@ -1,6 +1,6 @@ export * from './call-root.service' export * from './call-utility.service' export * from './call.service' -export * from './callkeep.service' +export * from './callkeep' export * from './calls-events.service' export * from './peer-connection.service' diff --git a/src/modules/calls/services/peer-connection.service.ts b/src/modules/calls/services/peer-connection.service.ts index c5e4ca5..6e73146 100644 --- a/src/modules/calls/services/peer-connection.service.ts +++ b/src/modules/calls/services/peer-connection.service.ts @@ -1,7 +1,7 @@ import { MediaStream, RTCPeerConnection } from 'react-native-webrtc' import { iceServers } from '../configs' import { CallRoot } from './call-root.service' -import { iceCandidateReq } from '@/api/calls/requests' +import { iceCandidateReq, sendNegotiationReq } from '@/api/calls/requests' import { CallMod, callsStreamsCtr, @@ -14,10 +14,14 @@ import { Alert } from 'react-native' import { appEvents } from '@/shared' class PeerConnectionService extends CallRoot { + private icecandidates: any[] + private dataChannel: RTCDataChannel private remoteDataChannel: RTCDataChannel public async createIns() { + this.icecandidates = [] + const peerConnection = new RTCPeerConnection({ iceServers: iceServers, }) @@ -45,18 +49,25 @@ class PeerConnectionService extends CallRoot { peerConnection.addEventListener('icecandidate', event => { if (event.candidate === null) { + if (this.store.isIncomeCall) { + this.sendIcecandidates() + } return } - iceCandidateReq({ - targetUserId: this.store.targetUserId, - candidates: [event.candidate], - }) + // iceCandidateReq({ + // targetUserId: this.store.targetUserId, + // candidates: [event.candidate], + // }) + + this.icecandidates.push(event.candidate) }) peerConnection.addEventListener('iceconnectionstatechange', event => { this.store.setConnectedStatus(peerConnection.iceConnectionState) + console.log('ICESTATUS', peerConnection.iceConnectionState) + if ( ['completed', 'connected'].includes( peerConnection.iceConnectionState, @@ -76,6 +87,33 @@ class PeerConnectionService extends CallRoot { new StopCall(useCallDataStore.getState, callsStreamsCtr).stop() } }) + + peerConnection.addEventListener('negotiationneeded', async () => { + try { + console.log('Negotiation needed', peerConnection.signalingState) + if (peerConnection.signalingState === 'stable') { + const offer = await peerConnection.createOffer({}) + await peerConnection.setLocalDescription(offer) + + console.log('offer') + sendNegotiationReq(this.store.callId, { + type: 'offer', + description: offer, + }) + } else { + const answer = await peerConnection.createAnswer() + await peerConnection.setLocalDescription(answer) + console.log('answer') + + sendNegotiationReq(this.store.callId, { + type: 'answer', + description: answer, + }) + } + } catch (error) { + console.error('Error creating offer/answer:', error) + } + }) } private createDataChannel(peerConnection: RTCPeerConnection) { @@ -114,6 +152,15 @@ class PeerConnectionService extends CallRoot { } } } + + public async sendIcecandidates() { + console.log('sendice') + await iceCandidateReq({ + targetUserId: this.store.targetUserId, + candidates: [...this.icecandidates], + }) + this.icecandidates = [] + } } export const peerConnectionService = new PeerConnectionService() diff --git a/src/modules/root/index.tsx b/src/modules/root/index.tsx index 8d57bed..530f974 100644 --- a/src/modules/root/index.tsx +++ b/src/modules/root/index.tsx @@ -50,9 +50,6 @@ export const Navigation: FC = () => { const { isConnected, status } = useNetConnect() - // const isConnected = true - // const status = 'online' - useSharedFiles() useAppSocketListener() useAppBadge() @@ -71,7 +68,6 @@ export const Navigation: FC = () => { if (!isAppReady && !_.isNull(isConnected)) { handleAutoAuth() } - // if (isConnected && !isAppReady) handleAutoAuth() }, [isConnected]) const modules = { diff --git a/src/modules/root/navigation-groups/users.group.tsx b/src/modules/root/navigation-groups/users.group.tsx index a8539c4..198db24 100644 --- a/src/modules/root/navigation-groups/users.group.tsx +++ b/src/modules/root/navigation-groups/users.group.tsx @@ -1,4 +1,4 @@ -import React, { FC } from 'react' +import React, { FC, useEffect } from 'react' import { RouteKey } from '@/shared' import { SelectChatBgScreen } from '@/modules/settings' import { createNativeStackNavigator } from '@react-navigation/native-stack' @@ -28,118 +28,130 @@ import { SendSharedFilesScreen, } from '@/modules/chats' import { CallScreen } from '@/modules/calls/screens/call' +import { callKeepService } from '@/modules/calls/services' +import { Platform } from 'react-native' const Stack = createNativeStackNavigator() -export const UsersGroup: FC = () => ( - - {/* --- Tab Navigation --- */} - +export const UsersGroup: FC = () => { + useEffect(() => { + if (Platform.OS === 'android') { + callKeepService.startAnswering() + } + }, []) + return ( + + {/* --- Tab Navigation --- */} + - {/* --- Contacts --- */} - + {/* --- Contacts --- */} + - {/* --- Settings --- */} - - + {/* --- Settings --- */} + + - {/* --- Chats --- */} - - - - - - - + {/* --- Chats --- */} + + + + + + + - {/* --- Tasks --- */} - - - - - + {/* --- Tasks --- */} + + + + + - + - + - {/* --- Comments --- */} - + {/* --- Comments --- */} + - + - {/* --- Users --- */} - + {/* --- Users --- */} + - {/* --- Group --- */} - + {/* --- Group --- */} + - {/* --- Executors --- */} - + {/* --- Executors --- */} + - - -) + + + ) +} diff --git a/src/services/domain/account.service.ts b/src/services/domain/account.service.ts index e64e3cf..587adff 100644 --- a/src/services/domain/account.service.ts +++ b/src/services/domain/account.service.ts @@ -3,6 +3,7 @@ import { SetLoadingAccount, SaveAccount } from '@/store/account' import { IUser } from '@/shared/interfaces' import { Service } from '@/shared/abstract' import { accountManagerInstance } from '@/managers' +import { appEvents } from '@/shared' class AccountService extends Service { protected prefix = 'account' @@ -14,6 +15,8 @@ class AccountService extends Service { try { const account = await this.accountManager.loadAccount() simpleDispatch(new SaveAccount({ account })) + + appEvents.emit('onAccountWasLoaded', {}) } catch (e) { } finally { simpleDispatch(new SetLoadingAccount({ isLoading: false })) diff --git a/src/services/domain/auth.service.ts b/src/services/domain/auth.service.ts index a08a9a3..6f79488 100644 --- a/src/services/domain/auth.service.ts +++ b/src/services/domain/auth.service.ts @@ -32,6 +32,8 @@ import { appEvents } from '@/shared' import { accountManagerInstance as accManager } from '@/managers' import { getErrorCode } from '@/shared/helpers' import { configsService } from './configs.service' +import { Platform } from 'react-native' +import { FirebaseMessagingService } from '../system/firebas-messaging.service' let phoneNumber: string @@ -93,7 +95,14 @@ const loadDataAfterAuth = async ( ) => { await accountService.loadAccount(cacheInfo.accountV) await permissionsService.loadPermissionsForUsers(cacheInfo.permissionsV) - VoipNotificationsService.getInstance().saveUser() + + if (Platform.OS === 'android') { + FirebaseMessagingService.getInstance().init() + } + if (Platform.OS === 'ios') { + VoipNotificationsService.getInstance().saveUser() + } + setAppIsReady() } diff --git a/src/services/system/firebas-messaging.service.ts b/src/services/system/firebas-messaging.service.ts new file mode 100644 index 0000000..ad0a89c --- /dev/null +++ b/src/services/system/firebas-messaging.service.ts @@ -0,0 +1,43 @@ +import messaging from '@react-native-firebase/messaging' +import { DeviceInfoService } from './device-info.service' +import { saveUserDeviceReq } from '@/api' + +export class FirebaseMessagingService { + static instance: FirebaseMessagingService + + static getInstance() { + if (!this.instance) { + this.instance = new FirebaseMessagingService() + } + + return this.instance + } + + public async init() { + const token = await this.getDeviceToken() + + if (token) { + await this.saveToken(token) + } + } + + private async getDeviceToken() { + try { + const token = await messaging().getToken() + return token + } catch (error) { + console.error('Error getting device token:', error) + } + } + + private async saveToken(token: string) { + const deviceUuid = await DeviceInfoService.getDeviceUniqueId() + + saveUserDeviceReq({ + deviceUuid, + notificationUserId: token, + type: 'f', + isDev: __DEV__, + }) + } +} diff --git a/src/services/system/notification.service.ts b/src/services/system/notification.service.ts index 606557a..7c5d1ac 100644 --- a/src/services/system/notification.service.ts +++ b/src/services/system/notification.service.ts @@ -11,6 +11,8 @@ import { navigate } from './navigation.service' import store from '@/store' import { selectAccount } from '@/store/account' import { SocketIo } from './real-time.service' +import RNCallKeep from 'react-native-callkeep' +import { getBundleId } from 'react-native-device-info' export const needRedirect = { to: null, @@ -172,6 +174,8 @@ export const initAndSaveDevice = async () => { const pushNotificationsDevice: any = await init() const deviceUuid = await DeviceInfoService.getDeviceUniqueId() + const bundleId = await getBundleId() + console.log(bundleId) if (pushNotificationsDevice) { await saveUserDeviceReq({ diff --git a/src/services/system/real-time.service.ts b/src/services/system/real-time.service.ts index 56903e0..5c12914 100644 --- a/src/services/system/real-time.service.ts +++ b/src/services/system/real-time.service.ts @@ -4,6 +4,7 @@ import io from 'socket.io-client' import { authService } from '../domain' import { GlobalContainerService } from './global-container.service' import { Alert } from 'react-native' +import RNCallKeep from 'react-native-callkeep' const store = () => GlobalContainerService.get('store') @@ -123,15 +124,12 @@ export class SocketIo { this._onSocketSendEvent('call/new') this._onSocketSendEvent('call/ICEcandidate') this._onSocketSendEvent('call/canceled') + this._onSocketSendEvent('calls/answered-by-another-device') this._on('error/join-user', async () => { await authService.refreshSession() this.emit('join-user') }) - - // this._on('reconnect_attempt', error => { - // console.log('SOCKET reconnect_attempt', error) - // }) } static instance: SocketIo = null diff --git a/src/services/system/voip-notification.service.ts b/src/services/system/voip-notification.service.ts index 684ab2c..fd45f94 100644 --- a/src/services/system/voip-notification.service.ts +++ b/src/services/system/voip-notification.service.ts @@ -1,6 +1,7 @@ import { saveUserDeviceReq } from '@/api' import VoipPushNotification from 'react-native-voip-push-notification' import { DeviceInfoService } from './device-info.service' + export class VoipNotificationsService { static instance: VoipNotificationsService @@ -20,6 +21,9 @@ export class VoipNotificationsService { 'register', this.handleRegister.bind(this), ) + // VoipPushNotification.addEventListener('notification', data => { + // console.log('data') + // }) VoipPushNotification.registerVoipToken() } catch (e) { @@ -47,7 +51,7 @@ export class VoipNotificationsService { saveUserDeviceReq({ deviceUuid, notificationUserId: this.voipToken, - isVoip: true, + type: 'v', isDev: __DEV__, }) }, 150) diff --git a/src/shared/events/index.ts b/src/shared/events/index.ts index bf640b4..d0cbf03 100644 --- a/src/shared/events/index.ts +++ b/src/shared/events/index.ts @@ -157,6 +157,8 @@ export type AppEvents = { 'call-channel/changeVideo': { value: boolean } + onAccountWasLoaded: {} + callSettingUpdated: {} } export type SocketEvents = { @@ -244,6 +246,14 @@ export type SocketEvents = { 'call/canceled': { callId: number } + 'call/negotiation': { + callId: string + type: 'answer' | 'offer' + rtcMessage: any + } + 'calls/answered-by-another-device': { + deviceUuid: string + } } export const appEvents = new Events()