diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml
index 3b3b531..ac81f89 100644
--- a/.github/workflows/nightly.yaml
+++ b/.github/workflows/nightly.yaml
@@ -21,4 +21,8 @@ jobs:
with:
ios: ${{ matrix.ios }}
xcode: ${{ matrix.xcode }}
+ secrets: inherit
+
+ android-nightly:
+ uses: ./.github/workflows/reusable-android-workflow.yaml
secrets: inherit
\ No newline at end of file
diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml
index 576780b..d0f68da 100644
--- a/.github/workflows/pr.yaml
+++ b/.github/workflows/pr.yaml
@@ -44,4 +44,11 @@ jobs:
is_pr: true
ios: ${{ matrix.ios }}
xcode: ${{ matrix.xcode }}
+ secrets: inherit
+
+ android-pr:
+ needs: [permission-check]
+ uses: ./.github/workflows/reusable-android-workflow.yaml
+ with:
+ is_pr: true
secrets: inherit
\ No newline at end of file
diff --git a/.github/workflows/reusable-android-workflow.yaml b/.github/workflows/reusable-android-workflow.yaml
new file mode 100644
index 0000000..1fa781b
--- /dev/null
+++ b/.github/workflows/reusable-android-workflow.yaml
@@ -0,0 +1,86 @@
+on:
+ workflow_call:
+ inputs:
+ is_pr:
+ type: boolean
+ default: false
+
+jobs:
+ test-android:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ if: ${{ inputs.is_pr }}
+ with:
+ fetch-depth: 100
+ ref: ${{ github.event.pull_request.head.sha }}
+ - uses: actions/checkout@v4
+ if: ${{ ! inputs.is_pr }}
+ with:
+ ref: ${{ github.head_ref }}
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - name: Install Dependencies
+ env:
+ TEST_CREDENTIALS: ${{ secrets.TEST_CREDENTIALS }}
+ run: |
+ npm install -g typescript
+ cd androidTests
+ ./prepareandroid.js
+ ./create_test_credentials_from_env.js
+ - uses: actions/setup-java@v4
+ with:
+ distribution: 'zulu'
+ java-version: '21'
+ - name: Setup Android SDK
+ uses: android-actions/setup-android@v3
+ - uses: gradle/actions/setup-gradle@v4
+ with:
+ gradle-version: "8.14.3"
+ add-job-summary: on-failure
+ - name: Build for Testing
+ run: |
+ cd androidTests/android
+ ./gradlew :app:assembleDebug :app:assembleAndroidTest
+ - uses: 'google-github-actions/auth@v2'
+ if: success() || failure()
+ with:
+ credentials_json: '${{ secrets.GCLOUD_SERVICE_KEY }}'
+ - uses: 'google-github-actions/setup-gcloud@v2'
+ if: success() || failure()
+ - name: Run Tests on Firebase Test Lab
+ if: success() || failure()
+ run: |
+ APP_APK="androidTests/android/app/build/outputs/apk/debug/app-debug.apk"
+ TEST_APK="androidTests/android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk"
+ gcloud firebase test android run \
+ --type instrumentation \
+ --app "$APP_APK" \
+ --test "$TEST_APK" \
+ --device model=Pixel2,version=33 \
+ --timeout 10m \
+ --results-bucket cloud-test-${GITHUB_REPOSITORY_OWNER} \
+ --results-dir "SalesforceReactNative/${GITHUB_RUN_ID}" \
+ --no-record-video
+ - name: Copy Test Results
+ if: success() || failure()
+ run: |
+ BUCKET_PATH="gs://cloud-test-${GITHUB_REPOSITORY_OWNER}/SalesforceReactNative/${GITHUB_RUN_ID}"
+ mkdir -p firebase_results
+ gsutil -m cp -r "${BUCKET_PATH}/*/test_result_*.xml" firebase_results/ 2>/dev/null || true
+ - name: Test Report
+ uses: mikepenz/action-junit-report@v6
+ if: success() || failure()
+ with:
+ check_name: Android Test Results
+ require_tests: true
+ fail_on_failure: true
+ report_paths: 'firebase_results/**.xml'
+ - name: Archive Test Results
+ uses: actions/upload-artifact@v4
+ if: success() || failure()
+ with:
+ name: test-results-android
+ path: 'firebase_results/**.xml'
diff --git a/.gitignore b/.gitignore
index a50a191..8b9da2d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,23 @@ Podfile.lock
yarn.lock
.DS_Store
+# Test credentials (contains real Salesforce org credentials)
+shared/test/test_credentials.json
+
+# Android test generated assets and credentials
+androidTests/android/app/src/main/assets/index.android.bundle
+androidTests/android/app/src/main/assets/test_credentials.json
+androidTests/android/app/src/main/assets/drawable-mdpi/
+androidTests/mobile_sdk/
+
+
+# Gradle build output
+androidTests/android/.gradle/
+androidTests/android/app/build/
+
+androidTests/android/.kotlin/
+androidTests/android/app/.cxx/
+
+# Android library build output
+android/.gradle/
+android/build/
diff --git a/CLAUDE.md b/CLAUDE.md
index bb226bb..c4e212f 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -7,9 +7,12 @@
The Salesforce Mobile SDK for React Native provides JavaScript/TypeScript bindings and native bridge modules that enable React Native applications to integrate with the Salesforce platform. This repo contains:
- **JavaScript/TypeScript libraries** (`src/`) - The public API exposed to React Native apps
-- **iOS bridge code** (`ios/SalesforceReact/`) - Objective-C modules that bridge to iOS SDK
+- **iOS bridge code** (`ios/SalesforceReact/`) - Objective-C++ TurboModule bridges to iOS SDK
+- **Android bridge code** (`android/`) - Kotlin TurboModule bridges to Android SDK
- **iOS tests** (`iosTests/`) - XCTest suite for iOS bridge functionality
+- **Android tests** (`androidTests/`) - AndroidX Test suite for Android bridge functionality
- **JavaScript tests** (`test/`) - Test suite for JavaScript API
+- **Pre-built codegen** (`android/generated/`) - C++ JavaTurboModule wrappers committed to npm package. Regenerated by `setversion.sh` during releases. Must be regenerated manually if bridge methods change in `src/specs/`.
**Key constraint**: This is a **public SDK**. Every change is visible to external developers. Backward compatibility, deprecation cycles, and semver discipline are non-negotiable.
@@ -23,11 +26,11 @@ React Native App
├── JavaScript/TypeScript API (src/)
├── iOS Bridge (ios/SalesforceReact/)
│ └── depends on → SalesforceMobileSDK-iOS libraries
- └── Android Bridge → SalesforceMobileSDK-Android/libs/SalesforceReact
+ └── Android Bridge (android/)
└── depends on → SalesforceMobileSDK-Android libraries
```
-**Important**: The Android bridge code lives in `SalesforceMobileSDK-Android/libs/SalesforceReact`, NOT in this repo. This repo only contains iOS bridge code and shared JavaScript/TypeScript.
+**Note**: As of SDK 14.0, the Android bridge code lives in this repo (`android/`), matching the iOS bridge layout. It was previously in `SalesforceMobileSDK-Android/libs/SalesforceReact/`. Both platforms now use unified `SF*` prefix module names (e.g. `SFOauthReactBridge`, `SFNetReactBridge`). React Native autolinking handles module registration automatically.
## Repository Structure
@@ -42,17 +45,25 @@ SalesforceMobileSDK-ReactNative/
│ ├── react.force.util.ts # Utilities
│ ├── react.force.log.ts # Logging
│ ├── react.force.test.ts # Test harness utilities
+│ ├── specs/ # TurboModule codegen specs
│ └── typings/ # TypeScript type definitions
-├── ios/SalesforceReact/ # iOS bridge modules (Objective-C)
-│ ├── SFOauthReactBridge.m # OAuth bridge
-│ ├── SFNetReactBridge.m # REST client bridge
-│ ├── SFSmartStoreReactBridge.m # SmartStore bridge
-│ ├── SFMobileSyncReactBridge.m # MobileSync bridge
-│ ├── SFSDKReactLogger.m # Logging bridge
+├── ios/SalesforceReact/ # iOS bridge modules (Objective-C++)
+│ ├── SFOauthReactBridge.mm # OAuth bridge
+│ ├── SFNetReactBridge.mm # REST client bridge
+│ ├── SFSmartStoreReactBridge.mm # SmartStore bridge
+│ ├── SFMobileSyncReactBridge.mm # MobileSync bridge
+│ ├── SFSDKReactLogger.mm # Logging bridge
│ └── SalesforceReactSDKManager.m # SDK manager
+├── android/ # Android bridge modules (Kotlin)
+│ ├── src/main/java/.../bridge/ # Bridge classes (SF*ReactBridge.kt)
+│ ├── src/main/java/.../ui/ # SalesforceReactActivity (bridgeless mode)
+│ ├── src/main/java/.../app/ # SDK manager
+│ └── build.gradle.kts # Gradle build config
├── iosTests/ # iOS test application
│ ├── ios/ # Xcode project with XCTest tests
│ └── prepareios.js # Test setup script
+├── androidTests/ # Android test application (mirrors iosTests/)
+│ └── mobile_sdk/ # Android SDK clone for testing
├── test/ # JavaScript test suite
│ ├── alltests.js # Test entry point
│ ├── oauth.test.js # OAuth tests
@@ -61,7 +72,7 @@ SalesforceMobileSDK-ReactNative/
│ ├── mobilesync.test.js # MobileSync tests
│ └── harness.test.js # Test infrastructure
├── dist/ # Compiled TypeScript output
-├── package.json # npm package definition
+├── package.json # npm package definition (includes codegenConfig)
├── SalesforceReact.podspec # CocoaPods spec for iOS
└── tsconfig.json # TypeScript configuration
```
@@ -79,7 +90,7 @@ The `SalesforceReact.podspec` declares dependencies on iOS SDK libraries:
These are pulled from the `SalesforceMobileSDK-iOS` repository via CocoaPods (published to `SalesforceMobileSDK-iOS-Specs`).
### Android Dependencies (via Gradle)
-The Android bridge in `SalesforceMobileSDK-Android/libs/SalesforceReact` depends on:
+The Android bridge in `android/` depends on:
- `MobileSync` library (which transitively includes SmartStore and SalesforceSDK)
- `react-android` from Facebook
@@ -96,17 +107,18 @@ React Native templates depend on this package via npm:
Each JavaScript module follows this pattern:
1. **JavaScript API** (`src/react.force.*.ts`): Public-facing TypeScript API
-2. **Native Bridge**: Calls to native modules via React Native's `NativeModules`
-3. **iOS Implementation** (`ios/SalesforceReact/SF*Bridge.m`): Objective-C code that calls iOS SDK
-4. **Android Implementation** (`../Android/libs/SalesforceReact/src/`): Kotlin code that calls Android SDK
+2. **TurboModule Spec** (`src/specs/NativeSF*.ts`): Codegen type definitions
+3. **Native Bridge**: Calls to native modules via `TurboModuleRegistry` (with `NativeModules` fallback)
+4. **iOS Implementation** (`ios/SalesforceReact/SF*Bridge.mm`): Objective-C++ code that calls iOS SDK
+5. **Android Implementation** (`android/src/.../bridge/SF*Bridge.kt`): Kotlin code that calls Android SDK
Example data flow for a REST API call:
```
JS: net.sendRequest(...)
- → NativeModules.SFNetReactBridge.sendRequest(...)
- → iOS: SFNetReactBridge.m calls RestClient from SalesforceSDKCore
- → Android: NetReactBridge.kt calls RestClient from SalesforceSDK
- ← Native bridge returns promise/callback
+ → SFNetReactBridge.sendRequest(...) (same module name on both platforms)
+ → iOS: SFNetReactBridge.mm calls RestClient from SalesforceSDKCore
+ → Android: SFNetReactBridge.kt calls RestClient from SalesforceSDK
+ ← Native bridge returns via unified single-callback pattern
← JS: Returns promise to app
```
@@ -116,7 +128,7 @@ JS: net.sendRequest(...)
- **Node.js**: 20+ (see `package.json` engines)
- **TypeScript**: Installed via devDependencies
- **iOS Development**: Xcode 15+, macOS
-- **Android Development**: For Android bridge testing, see Android repo
+- **Android Development**: For Android bridge testing, see `androidTests/`
### Build JavaScript/TypeScript
@@ -161,7 +173,7 @@ The `test/` directory contains the shared test suite used by both iOS and Androi
```bash
# Tests are bundled into iOS/Android test apps
# See iosTests/README.md for iOS testing
-# See Android repo for Android testing
+# See androidTests/ for Android testing
```
**Test files**:
@@ -198,10 +210,11 @@ The `test/` directory contains the shared test suite used by both iOS and Androi
- **No direct UI work on bridge thread**: Dispatch to main queue when needed
### Android Bridge Standards (Kotlin)
-See `SalesforceMobileSDK-Android/CLAUDE.md` for Android-specific standards. Key points:
-- **Kotlin for all new code** in Android bridge
+- **Kotlin for all new code** in Android bridge (`android/`)
+- **TurboModule interface**: All bridges implement `TurboModule` and use the unified single-callback pattern
- **Coroutines preferred** for async operations
-- Follow Android SDK conventions
+- **Module names**: Must use `SF*` prefix matching iOS (e.g. `SFOauthReactBridge`)
+- Follow Android SDK conventions (see `SalesforceMobileSDK-Android/CLAUDE.md`)
## Testing Standards
@@ -220,8 +233,8 @@ See `SalesforceMobileSDK-Android/CLAUDE.md` for Android-specific standards. Key
### Android Bridge Tests
- **Framework**: AndroidX Test with JUnit
-- **Location**: `SalesforceMobileSDK-Android/libs/SalesforceReact` (separate repo)
-- **Run command**: `./gradlew :libs:SalesforceReact:connectedAndroidTest`
+- **Location**: `androidTests/` (mirrors `iosTests/`)
+- **Run command**: See `androidTests/` for setup and execution
### What to Test for Each Module
@@ -258,18 +271,16 @@ See `SalesforceMobileSDK-Android/CLAUDE.md` for Android-specific standards. Key
When making changes that affect the public API:
1. **Modify TypeScript API** in `src/`
-2. **Update iOS bridge** in `ios/SalesforceReact/`
-3. **Update Android bridge** in `SalesforceMobileSDK-Android/libs/SalesforceReact/`
-4. **Update type definitions** in `src/typings/`
-5. **Add tests** in `test/` (shared by both platforms)
-6. **Run iOS tests** via `iosTests/`
-7. **Run Android tests** in Android repo
-8. **Update React Native templates** if needed (in Templates repo)
-
-**Important**: A complete feature requires changes in multiple repos:
-- This repo (JavaScript + iOS bridge)
-- Android repo (Android bridge)
-- Templates repo (if template updates needed)
+2. **Update TurboModule spec** in `src/specs/`
+3. **Update iOS bridge** in `ios/SalesforceReact/`
+4. **Update Android bridge** in `android/`
+5. **Update type definitions** in `src/typings/`
+6. **Add tests** in `test/` (shared by both platforms)
+7. **Run iOS tests** via `iosTests/`
+8. **Run Android tests** via `androidTests/`
+9. **Update React Native templates** if needed (in Templates repo)
+
+**Important**: A complete feature requires changes in this repo (JavaScript + iOS bridge + Android bridge) plus the Templates repo if template updates are needed. No changes to the Android SDK repo are needed for bridge work.
## Code Review Checklist
@@ -280,7 +291,7 @@ When reviewing PRs:
- [ ] **Backward compatibility**: No breaking changes without deprecation cycle
- [ ] **Tests included**: JavaScript tests cover new functionality
- [ ] **iOS tests pass**: Run iosTests suite
-- [ ] **Android tests pass**: Verify in Android repo
+- [ ] **Android tests pass**: Run androidTests/
- [ ] **Documentation**: JSDoc comments on public APIs
- [ ] **Templates work**: Test with ReactNativeTemplate if API changed
- [ ] **No console warnings**: No ESLint or TypeScript compiler warnings
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000..959afc0
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..21b41ca
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,47 @@
+apply plugin: 'com.android.library'
+apply plugin: 'org.jetbrains.kotlin.android'
+
+
+android {
+ namespace "com.salesforce.androidsdk.reactnative"
+ compileSdk 36
+
+ defaultConfig {
+ minSdk 28
+ }
+
+ sourceSets {
+ main {
+ manifest.srcFile "AndroidManifest.xml"
+ java.srcDirs = ["src/main/java"]
+ res.srcDirs = ["res"]
+ assets.srcDirs = ["assets"]
+ }
+ }
+
+ buildFeatures {
+ buildConfig true
+ aidl true
+ }
+
+ packaging {
+ resources {
+ excludes += ['META-INF/LICENSE', 'META-INF/LICENSE.txt', 'META-INF/DEPENDENCIES', 'META-INF/NOTICE']
+ }
+ }
+
+ lint {
+ abortOnError false
+ }
+}
+
+kotlin {
+ jvmToolchain(17)
+}
+
+dependencies {
+ api 'com.salesforce.mobilesdk:MobileSync:14.0.0'
+ api 'com.facebook.react:react-android:0.81.5'
+ implementation 'androidx.core:core-ktx:1.18.0'
+}
+
diff --git a/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFMobileSyncReactBridgeSpec.java b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFMobileSyncReactBridgeSpec.java
new file mode 100644
index 0000000..8165b5d
--- /dev/null
+++ b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFMobileSyncReactBridgeSpec.java
@@ -0,0 +1,59 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJavaSpec.js
+ *
+ * @nolint
+ */
+
+package com.facebook.fbreact.specs;
+
+import com.facebook.proguard.annotations.DoNotStrip;
+import com.facebook.react.bridge.Callback;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.turbomodule.core.interfaces.TurboModule;
+import javax.annotation.Nonnull;
+
+public abstract class NativeSFMobileSyncReactBridgeSpec extends ReactContextBaseJavaModule implements TurboModule {
+ public static final String NAME = "SFMobileSyncReactBridge";
+
+ public NativeSFMobileSyncReactBridgeSpec(ReactApplicationContext reactContext) {
+ super(reactContext);
+ }
+
+ @Override
+ public @Nonnull String getName() {
+ return NAME;
+ }
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void syncDown(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void syncUp(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void reSync(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getSyncStatus(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void deleteSync(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void cleanResyncGhosts(ReadableMap args, Callback callback);
+}
diff --git a/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFNetReactBridgeSpec.java b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFNetReactBridgeSpec.java
new file mode 100644
index 0000000..d3cb95b
--- /dev/null
+++ b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFNetReactBridgeSpec.java
@@ -0,0 +1,39 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJavaSpec.js
+ *
+ * @nolint
+ */
+
+package com.facebook.fbreact.specs;
+
+import com.facebook.proguard.annotations.DoNotStrip;
+import com.facebook.react.bridge.Callback;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.turbomodule.core.interfaces.TurboModule;
+import javax.annotation.Nonnull;
+
+public abstract class NativeSFNetReactBridgeSpec extends ReactContextBaseJavaModule implements TurboModule {
+ public static final String NAME = "SFNetReactBridge";
+
+ public NativeSFNetReactBridgeSpec(ReactApplicationContext reactContext) {
+ super(reactContext);
+ }
+
+ @Override
+ public @Nonnull String getName() {
+ return NAME;
+ }
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void sendRequest(ReadableMap args, Callback callback);
+}
diff --git a/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFOauthReactBridgeSpec.java b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFOauthReactBridgeSpec.java
new file mode 100644
index 0000000..7745a65
--- /dev/null
+++ b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFOauthReactBridgeSpec.java
@@ -0,0 +1,47 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJavaSpec.js
+ *
+ * @nolint
+ */
+
+package com.facebook.fbreact.specs;
+
+import com.facebook.proguard.annotations.DoNotStrip;
+import com.facebook.react.bridge.Callback;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.turbomodule.core.interfaces.TurboModule;
+import javax.annotation.Nonnull;
+
+public abstract class NativeSFOauthReactBridgeSpec extends ReactContextBaseJavaModule implements TurboModule {
+ public static final String NAME = "SFOauthReactBridge";
+
+ public NativeSFOauthReactBridgeSpec(ReactApplicationContext reactContext) {
+ super(reactContext);
+ }
+
+ @Override
+ public @Nonnull String getName() {
+ return NAME;
+ }
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getAuthCredentials(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void authenticate(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void logoutCurrentUser(ReadableMap args, Callback callback);
+}
diff --git a/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFSmartStoreReactBridgeSpec.java b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFSmartStoreReactBridgeSpec.java
new file mode 100644
index 0000000..50a8646
--- /dev/null
+++ b/android/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSFSmartStoreReactBridgeSpec.java
@@ -0,0 +1,115 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJavaSpec.js
+ *
+ * @nolint
+ */
+
+package com.facebook.fbreact.specs;
+
+import com.facebook.proguard.annotations.DoNotStrip;
+import com.facebook.react.bridge.Callback;
+import com.facebook.react.bridge.ReactApplicationContext;
+import com.facebook.react.bridge.ReactContextBaseJavaModule;
+import com.facebook.react.bridge.ReactMethod;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.turbomodule.core.interfaces.TurboModule;
+import javax.annotation.Nonnull;
+
+public abstract class NativeSFSmartStoreReactBridgeSpec extends ReactContextBaseJavaModule implements TurboModule {
+ public static final String NAME = "SFSmartStoreReactBridge";
+
+ public NativeSFSmartStoreReactBridgeSpec(ReactApplicationContext reactContext) {
+ super(reactContext);
+ }
+
+ @Override
+ public @Nonnull String getName() {
+ return NAME;
+ }
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void soupExists(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void registerSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void removeSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getSoupIndexSpecs(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void alterSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void reIndexSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void clearSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void upsertSoupEntries(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void retrieveSoupEntries(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void removeFromSoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void querySoup(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void runSmartQuery(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void moveCursorToPageIndex(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void closeCursor(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getDatabaseSize(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getAllStores(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void getAllGlobalStores(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void removeStore(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void removeAllStores(ReadableMap args, Callback callback);
+
+ @ReactMethod
+ @DoNotStrip
+ public abstract void removeAllGlobalStores(ReadableMap args, Callback callback);
+}
diff --git a/android/generated/source/codegen/jni/CMakeLists.txt b/android/generated/source/codegen/jni/CMakeLists.txt
new file mode 100644
index 0000000..f53d718
--- /dev/null
+++ b/android/generated/source/codegen/jni/CMakeLists.txt
@@ -0,0 +1,28 @@
+# Copyright (c) Meta Platforms, Inc. and affiliates.
+#
+# This source code is licensed under the MIT license found in the
+# LICENSE file in the root directory of this source tree.
+
+cmake_minimum_required(VERSION 3.13)
+set(CMAKE_VERBOSE_MAKEFILE on)
+
+file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNSalesforceReactSpec/*.cpp)
+
+add_library(
+ react_codegen_RNSalesforceReactSpec
+ OBJECT
+ ${react_codegen_SRCS}
+)
+
+target_include_directories(react_codegen_RNSalesforceReactSpec PUBLIC . react/renderer/components/RNSalesforceReactSpec)
+
+target_link_libraries(
+ react_codegen_RNSalesforceReactSpec
+ fbjni
+ jsi
+ # We need to link different libraries based on whether we are building rncore or not, that's necessary
+ # because we want to break a circular dependency between react_codegen_rncore and reactnative
+ reactnative
+)
+
+target_compile_reactnative_options(react_codegen_RNSalesforceReactSpec PRIVATE)
diff --git a/android/generated/source/codegen/jni/RNSalesforceReactSpec-generated.cpp b/android/generated/source/codegen/jni/RNSalesforceReactSpec-generated.cpp
new file mode 100644
index 0000000..646d81d
--- /dev/null
+++ b/android/generated/source/codegen/jni/RNSalesforceReactSpec-generated.cpp
@@ -0,0 +1,224 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJniCpp.js
+ */
+
+#include "RNSalesforceReactSpec.h"
+
+namespace facebook::react {
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_syncDown(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "syncDown", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_syncUp(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "syncUp", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_reSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "reSync", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_getSyncStatus(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getSyncStatus", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_deleteSync(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "deleteSync", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_cleanResyncGhosts(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "cleanResyncGhosts", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+NativeSFMobileSyncReactBridgeSpecJSI::NativeSFMobileSyncReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms)
+ : JavaTurboModule(params) {
+ methodMap_["syncDown"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_syncDown};
+ methodMap_["syncUp"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_syncUp};
+ methodMap_["reSync"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_reSync};
+ methodMap_["getSyncStatus"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_getSyncStatus};
+ methodMap_["deleteSync"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_deleteSync};
+ methodMap_["cleanResyncGhosts"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeSpecJSI_cleanResyncGhosts};
+}
+static facebook::jsi::Value __hostFunction_NativeSFNetReactBridgeSpecJSI_sendRequest(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "sendRequest", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+NativeSFNetReactBridgeSpecJSI::NativeSFNetReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms)
+ : JavaTurboModule(params) {
+ methodMap_["sendRequest"] = MethodMetadata {2, __hostFunction_NativeSFNetReactBridgeSpecJSI_sendRequest};
+}
+static facebook::jsi::Value __hostFunction_NativeSFOauthReactBridgeSpecJSI_getAuthCredentials(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getAuthCredentials", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFOauthReactBridgeSpecJSI_authenticate(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "authenticate", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFOauthReactBridgeSpecJSI_logoutCurrentUser(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "logoutCurrentUser", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+NativeSFOauthReactBridgeSpecJSI::NativeSFOauthReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms)
+ : JavaTurboModule(params) {
+ methodMap_["getAuthCredentials"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeSpecJSI_getAuthCredentials};
+ methodMap_["authenticate"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeSpecJSI_authenticate};
+ methodMap_["logoutCurrentUser"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeSpecJSI_logoutCurrentUser};
+}
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_soupExists(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "soupExists", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_registerSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "registerSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getSoupIndexSpecs(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getSoupIndexSpecs", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_alterSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "alterSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_reIndexSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "reIndexSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_clearSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "clearSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_upsertSoupEntries(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "upsertSoupEntries", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_retrieveSoupEntries(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "retrieveSoupEntries", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeFromSoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeFromSoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_querySoup(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "querySoup", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_runSmartQuery(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "runSmartQuery", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_moveCursorToPageIndex(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "moveCursorToPageIndex", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_closeCursor(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "closeCursor", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getDatabaseSize(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getDatabaseSize", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getAllStores(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getAllStores", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getAllGlobalStores(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "getAllGlobalStores", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeStore(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeStore", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeAllStores(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeAllStores", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+static facebook::jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeAllGlobalStores(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
+ static jmethodID cachedMethodId = nullptr;
+ return static_cast(turboModule).invokeJavaMethod(rt, VoidKind, "removeAllGlobalStores", "(Lcom/facebook/react/bridge/ReadableMap;Lcom/facebook/react/bridge/Callback;)V", args, count, cachedMethodId);
+}
+
+NativeSFSmartStoreReactBridgeSpecJSI::NativeSFSmartStoreReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms)
+ : JavaTurboModule(params) {
+ methodMap_["soupExists"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_soupExists};
+ methodMap_["registerSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_registerSoup};
+ methodMap_["removeSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeSoup};
+ methodMap_["getSoupIndexSpecs"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getSoupIndexSpecs};
+ methodMap_["alterSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_alterSoup};
+ methodMap_["reIndexSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_reIndexSoup};
+ methodMap_["clearSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_clearSoup};
+ methodMap_["upsertSoupEntries"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_upsertSoupEntries};
+ methodMap_["retrieveSoupEntries"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_retrieveSoupEntries};
+ methodMap_["removeFromSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeFromSoup};
+ methodMap_["querySoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_querySoup};
+ methodMap_["runSmartQuery"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_runSmartQuery};
+ methodMap_["moveCursorToPageIndex"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_moveCursorToPageIndex};
+ methodMap_["closeCursor"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_closeCursor};
+ methodMap_["getDatabaseSize"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getDatabaseSize};
+ methodMap_["getAllStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getAllStores};
+ methodMap_["getAllGlobalStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_getAllGlobalStores};
+ methodMap_["removeStore"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeStore};
+ methodMap_["removeAllStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeAllStores};
+ methodMap_["removeAllGlobalStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeSpecJSI_removeAllGlobalStores};
+}
+
+std::shared_ptr RNSalesforceReactSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
+ if (moduleName == "SFMobileSyncReactBridge") {
+ return std::make_shared(params);
+ }
+ if (moduleName == "SFNetReactBridge") {
+ return std::make_shared(params);
+ }
+ if (moduleName == "SFOauthReactBridge") {
+ return std::make_shared(params);
+ }
+ if (moduleName == "SFSmartStoreReactBridge") {
+ return std::make_shared(params);
+ }
+ return nullptr;
+}
+
+} // namespace facebook::react
diff --git a/android/generated/source/codegen/jni/RNSalesforceReactSpec.h b/android/generated/source/codegen/jni/RNSalesforceReactSpec.h
new file mode 100644
index 0000000..b1b46cb
--- /dev/null
+++ b/android/generated/source/codegen/jni/RNSalesforceReactSpec.h
@@ -0,0 +1,55 @@
+
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleJniH.js
+ */
+
+#pragma once
+
+#include
+#include
+#include
+
+namespace facebook::react {
+
+/**
+ * JNI C++ class for module 'NativeSFMobileSyncReactBridge'
+ */
+class JSI_EXPORT NativeSFMobileSyncReactBridgeSpecJSI : public JavaTurboModule {
+public:
+ NativeSFMobileSyncReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms);
+};
+
+/**
+ * JNI C++ class for module 'NativeSFNetReactBridge'
+ */
+class JSI_EXPORT NativeSFNetReactBridgeSpecJSI : public JavaTurboModule {
+public:
+ NativeSFNetReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms);
+};
+
+/**
+ * JNI C++ class for module 'NativeSFOauthReactBridge'
+ */
+class JSI_EXPORT NativeSFOauthReactBridgeSpecJSI : public JavaTurboModule {
+public:
+ NativeSFOauthReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms);
+};
+
+/**
+ * JNI C++ class for module 'NativeSFSmartStoreReactBridge'
+ */
+class JSI_EXPORT NativeSFSmartStoreReactBridgeSpecJSI : public JavaTurboModule {
+public:
+ NativeSFSmartStoreReactBridgeSpecJSI(const JavaTurboModule::InitParams ¶ms);
+};
+
+
+JSI_EXPORT
+std::shared_ptr RNSalesforceReactSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms);
+
+} // namespace facebook::react
diff --git a/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI-generated.cpp b/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI-generated.cpp
new file mode 100644
index 0000000..e1c7e81
--- /dev/null
+++ b/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI-generated.cpp
@@ -0,0 +1,302 @@
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleCpp.js
+ */
+
+#include "RNSalesforceReactSpecJSI.h"
+
+namespace facebook::react {
+
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_syncDown(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->syncDown(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_syncUp(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->syncUp(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_reSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->reSync(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_getSyncStatus(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getSyncStatus(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_deleteSync(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->deleteSync(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_cleanResyncGhosts(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->cleanResyncGhosts(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+
+NativeSFMobileSyncReactBridgeCxxSpecJSI::NativeSFMobileSyncReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker)
+ : TurboModule("SFMobileSyncReactBridge", jsInvoker) {
+ methodMap_["syncDown"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_syncDown};
+ methodMap_["syncUp"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_syncUp};
+ methodMap_["reSync"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_reSync};
+ methodMap_["getSyncStatus"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_getSyncStatus};
+ methodMap_["deleteSync"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_deleteSync};
+ methodMap_["cleanResyncGhosts"] = MethodMetadata {2, __hostFunction_NativeSFMobileSyncReactBridgeCxxSpecJSI_cleanResyncGhosts};
+}
+static jsi::Value __hostFunction_NativeSFNetReactBridgeCxxSpecJSI_sendRequest(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->sendRequest(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+
+NativeSFNetReactBridgeCxxSpecJSI::NativeSFNetReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker)
+ : TurboModule("SFNetReactBridge", jsInvoker) {
+ methodMap_["sendRequest"] = MethodMetadata {2, __hostFunction_NativeSFNetReactBridgeCxxSpecJSI_sendRequest};
+}
+static jsi::Value __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_getAuthCredentials(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getAuthCredentials(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_authenticate(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->authenticate(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_logoutCurrentUser(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->logoutCurrentUser(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+
+NativeSFOauthReactBridgeCxxSpecJSI::NativeSFOauthReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker)
+ : TurboModule("SFOauthReactBridge", jsInvoker) {
+ methodMap_["getAuthCredentials"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_getAuthCredentials};
+ methodMap_["authenticate"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_authenticate};
+ methodMap_["logoutCurrentUser"] = MethodMetadata {2, __hostFunction_NativeSFOauthReactBridgeCxxSpecJSI_logoutCurrentUser};
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_soupExists(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->soupExists(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_registerSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->registerSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->removeSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getSoupIndexSpecs(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getSoupIndexSpecs(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_alterSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->alterSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_reIndexSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->reIndexSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_clearSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->clearSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_upsertSoupEntries(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->upsertSoupEntries(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_retrieveSoupEntries(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->retrieveSoupEntries(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeFromSoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->removeFromSoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_querySoup(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->querySoup(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_runSmartQuery(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->runSmartQuery(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_moveCursorToPageIndex(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->moveCursorToPageIndex(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_closeCursor(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->closeCursor(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getDatabaseSize(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getDatabaseSize(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getAllStores(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getAllStores(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getAllGlobalStores(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->getAllGlobalStores(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeStore(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->removeStore(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeAllStores(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->removeAllStores(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+static jsi::Value __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeAllGlobalStores(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
+ static_cast(&turboModule)->removeAllGlobalStores(
+ rt,
+ count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asObject(rt),
+ count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asObject(rt).asFunction(rt)
+ );
+ return jsi::Value::undefined();
+}
+
+NativeSFSmartStoreReactBridgeCxxSpecJSI::NativeSFSmartStoreReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker)
+ : TurboModule("SFSmartStoreReactBridge", jsInvoker) {
+ methodMap_["soupExists"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_soupExists};
+ methodMap_["registerSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_registerSoup};
+ methodMap_["removeSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeSoup};
+ methodMap_["getSoupIndexSpecs"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getSoupIndexSpecs};
+ methodMap_["alterSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_alterSoup};
+ methodMap_["reIndexSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_reIndexSoup};
+ methodMap_["clearSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_clearSoup};
+ methodMap_["upsertSoupEntries"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_upsertSoupEntries};
+ methodMap_["retrieveSoupEntries"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_retrieveSoupEntries};
+ methodMap_["removeFromSoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeFromSoup};
+ methodMap_["querySoup"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_querySoup};
+ methodMap_["runSmartQuery"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_runSmartQuery};
+ methodMap_["moveCursorToPageIndex"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_moveCursorToPageIndex};
+ methodMap_["closeCursor"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_closeCursor};
+ methodMap_["getDatabaseSize"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getDatabaseSize};
+ methodMap_["getAllStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getAllStores};
+ methodMap_["getAllGlobalStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_getAllGlobalStores};
+ methodMap_["removeStore"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeStore};
+ methodMap_["removeAllStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeAllStores};
+ methodMap_["removeAllGlobalStores"] = MethodMetadata {2, __hostFunction_NativeSFSmartStoreReactBridgeCxxSpecJSI_removeAllGlobalStores};
+}
+
+
+} // namespace facebook::react
diff --git a/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI.h b/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI.h
new file mode 100644
index 0000000..878c484
--- /dev/null
+++ b/android/generated/source/codegen/jni/react/renderer/components/RNSalesforceReactSpec/RNSalesforceReactSpecJSI.h
@@ -0,0 +1,467 @@
+/**
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
+ *
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
+ * once the code is regenerated.
+ *
+ * @generated by codegen project: GenerateModuleH.js
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace facebook::react {
+
+
+ class JSI_EXPORT NativeSFMobileSyncReactBridgeCxxSpecJSI : public TurboModule {
+protected:
+ NativeSFMobileSyncReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker);
+
+public:
+ virtual void syncDown(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void syncUp(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void reSync(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void getSyncStatus(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void deleteSync(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void cleanResyncGhosts(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+
+};
+
+template
+class JSI_EXPORT NativeSFMobileSyncReactBridgeCxxSpec : public TurboModule {
+public:
+ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
+ return delegate_.create(rt, propName);
+ }
+
+ std::vector getPropertyNames(jsi::Runtime& runtime) override {
+ return delegate_.getPropertyNames(runtime);
+ }
+
+ static constexpr std::string_view kModuleName = "SFMobileSyncReactBridge";
+
+protected:
+ NativeSFMobileSyncReactBridgeCxxSpec(std::shared_ptr jsInvoker)
+ : TurboModule(std::string{NativeSFMobileSyncReactBridgeCxxSpec::kModuleName}, jsInvoker),
+ delegate_(reinterpret_cast(this), jsInvoker) {}
+
+
+private:
+ class Delegate : public NativeSFMobileSyncReactBridgeCxxSpecJSI {
+ public:
+ Delegate(T *instance, std::shared_ptr jsInvoker) :
+ NativeSFMobileSyncReactBridgeCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
+
+ }
+
+ void syncDown(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::syncDown) == 3,
+ "Expected syncDown(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::syncDown, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void syncUp(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::syncUp) == 3,
+ "Expected syncUp(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::syncUp, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void reSync(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::reSync) == 3,
+ "Expected reSync(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::reSync, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void getSyncStatus(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getSyncStatus) == 3,
+ "Expected getSyncStatus(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getSyncStatus, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void deleteSync(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::deleteSync) == 3,
+ "Expected deleteSync(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::deleteSync, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void cleanResyncGhosts(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::cleanResyncGhosts) == 3,
+ "Expected cleanResyncGhosts(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::cleanResyncGhosts, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+
+ private:
+ friend class NativeSFMobileSyncReactBridgeCxxSpec;
+ T *instance_;
+ };
+
+ Delegate delegate_;
+};
+
+
+ class JSI_EXPORT NativeSFNetReactBridgeCxxSpecJSI : public TurboModule {
+protected:
+ NativeSFNetReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker);
+
+public:
+ virtual void sendRequest(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+
+};
+
+template
+class JSI_EXPORT NativeSFNetReactBridgeCxxSpec : public TurboModule {
+public:
+ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
+ return delegate_.create(rt, propName);
+ }
+
+ std::vector getPropertyNames(jsi::Runtime& runtime) override {
+ return delegate_.getPropertyNames(runtime);
+ }
+
+ static constexpr std::string_view kModuleName = "SFNetReactBridge";
+
+protected:
+ NativeSFNetReactBridgeCxxSpec(std::shared_ptr jsInvoker)
+ : TurboModule(std::string{NativeSFNetReactBridgeCxxSpec::kModuleName}, jsInvoker),
+ delegate_(reinterpret_cast(this), jsInvoker) {}
+
+
+private:
+ class Delegate : public NativeSFNetReactBridgeCxxSpecJSI {
+ public:
+ Delegate(T *instance, std::shared_ptr jsInvoker) :
+ NativeSFNetReactBridgeCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
+
+ }
+
+ void sendRequest(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::sendRequest) == 3,
+ "Expected sendRequest(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::sendRequest, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+
+ private:
+ friend class NativeSFNetReactBridgeCxxSpec;
+ T *instance_;
+ };
+
+ Delegate delegate_;
+};
+
+
+ class JSI_EXPORT NativeSFOauthReactBridgeCxxSpecJSI : public TurboModule {
+protected:
+ NativeSFOauthReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker);
+
+public:
+ virtual void getAuthCredentials(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void authenticate(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void logoutCurrentUser(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+
+};
+
+template
+class JSI_EXPORT NativeSFOauthReactBridgeCxxSpec : public TurboModule {
+public:
+ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
+ return delegate_.create(rt, propName);
+ }
+
+ std::vector getPropertyNames(jsi::Runtime& runtime) override {
+ return delegate_.getPropertyNames(runtime);
+ }
+
+ static constexpr std::string_view kModuleName = "SFOauthReactBridge";
+
+protected:
+ NativeSFOauthReactBridgeCxxSpec(std::shared_ptr jsInvoker)
+ : TurboModule(std::string{NativeSFOauthReactBridgeCxxSpec::kModuleName}, jsInvoker),
+ delegate_(reinterpret_cast(this), jsInvoker) {}
+
+
+private:
+ class Delegate : public NativeSFOauthReactBridgeCxxSpecJSI {
+ public:
+ Delegate(T *instance, std::shared_ptr jsInvoker) :
+ NativeSFOauthReactBridgeCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
+
+ }
+
+ void getAuthCredentials(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getAuthCredentials) == 3,
+ "Expected getAuthCredentials(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getAuthCredentials, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void authenticate(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::authenticate) == 3,
+ "Expected authenticate(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::authenticate, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void logoutCurrentUser(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::logoutCurrentUser) == 3,
+ "Expected logoutCurrentUser(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::logoutCurrentUser, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+
+ private:
+ friend class NativeSFOauthReactBridgeCxxSpec;
+ T *instance_;
+ };
+
+ Delegate delegate_;
+};
+
+
+ class JSI_EXPORT NativeSFSmartStoreReactBridgeCxxSpecJSI : public TurboModule {
+protected:
+ NativeSFSmartStoreReactBridgeCxxSpecJSI(std::shared_ptr jsInvoker);
+
+public:
+ virtual void soupExists(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void registerSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void removeSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void getSoupIndexSpecs(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void alterSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void reIndexSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void clearSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void upsertSoupEntries(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void retrieveSoupEntries(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void removeFromSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void querySoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void runSmartQuery(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void moveCursorToPageIndex(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void closeCursor(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void getDatabaseSize(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void getAllStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void getAllGlobalStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void removeStore(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void removeAllStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+ virtual void removeAllGlobalStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) = 0;
+
+};
+
+template
+class JSI_EXPORT NativeSFSmartStoreReactBridgeCxxSpec : public TurboModule {
+public:
+ jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
+ return delegate_.create(rt, propName);
+ }
+
+ std::vector getPropertyNames(jsi::Runtime& runtime) override {
+ return delegate_.getPropertyNames(runtime);
+ }
+
+ static constexpr std::string_view kModuleName = "SFSmartStoreReactBridge";
+
+protected:
+ NativeSFSmartStoreReactBridgeCxxSpec(std::shared_ptr jsInvoker)
+ : TurboModule(std::string{NativeSFSmartStoreReactBridgeCxxSpec::kModuleName}, jsInvoker),
+ delegate_(reinterpret_cast(this), jsInvoker) {}
+
+
+private:
+ class Delegate : public NativeSFSmartStoreReactBridgeCxxSpecJSI {
+ public:
+ Delegate(T *instance, std::shared_ptr jsInvoker) :
+ NativeSFSmartStoreReactBridgeCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
+
+ }
+
+ void soupExists(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::soupExists) == 3,
+ "Expected soupExists(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::soupExists, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void registerSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::registerSoup) == 3,
+ "Expected registerSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::registerSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void removeSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::removeSoup) == 3,
+ "Expected removeSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::removeSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void getSoupIndexSpecs(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getSoupIndexSpecs) == 3,
+ "Expected getSoupIndexSpecs(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getSoupIndexSpecs, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void alterSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::alterSoup) == 3,
+ "Expected alterSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::alterSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void reIndexSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::reIndexSoup) == 3,
+ "Expected reIndexSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::reIndexSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void clearSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::clearSoup) == 3,
+ "Expected clearSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::clearSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void upsertSoupEntries(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::upsertSoupEntries) == 3,
+ "Expected upsertSoupEntries(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::upsertSoupEntries, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void retrieveSoupEntries(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::retrieveSoupEntries) == 3,
+ "Expected retrieveSoupEntries(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::retrieveSoupEntries, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void removeFromSoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::removeFromSoup) == 3,
+ "Expected removeFromSoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::removeFromSoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void querySoup(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::querySoup) == 3,
+ "Expected querySoup(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::querySoup, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void runSmartQuery(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::runSmartQuery) == 3,
+ "Expected runSmartQuery(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::runSmartQuery, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void moveCursorToPageIndex(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::moveCursorToPageIndex) == 3,
+ "Expected moveCursorToPageIndex(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::moveCursorToPageIndex, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void closeCursor(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::closeCursor) == 3,
+ "Expected closeCursor(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::closeCursor, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void getDatabaseSize(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getDatabaseSize) == 3,
+ "Expected getDatabaseSize(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getDatabaseSize, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void getAllStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getAllStores) == 3,
+ "Expected getAllStores(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getAllStores, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void getAllGlobalStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::getAllGlobalStores) == 3,
+ "Expected getAllGlobalStores(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::getAllGlobalStores, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void removeStore(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::removeStore) == 3,
+ "Expected removeStore(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::removeStore, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void removeAllStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::removeAllStores) == 3,
+ "Expected removeAllStores(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::removeAllStores, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+ void removeAllGlobalStores(jsi::Runtime &rt, jsi::Object args, jsi::Function callback) override {
+ static_assert(
+ bridging::getParameterCount(&T::removeAllGlobalStores) == 3,
+ "Expected removeAllGlobalStores(...) to have 3 parameters");
+
+ return bridging::callFromJs(
+ rt, &T::removeAllGlobalStores, jsInvoker_, instance_, std::move(args), std::move(callback));
+ }
+
+ private:
+ friend class NativeSFSmartStoreReactBridgeCxxSpec;
+ T *instance_;
+ };
+
+ Delegate delegate_;
+};
+
+} // namespace facebook::react
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..5bac8ac
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1 @@
+android.useAndroidX=true
diff --git a/android/res/values/sf__strings.xml b/android/res/values/sf__strings.xml
new file mode 100644
index 0000000..6e2411f
--- /dev/null
+++ b/android/res/values/sf__strings.xml
@@ -0,0 +1,4 @@
+
+
+ Should authenticate but is offline - cannot proceed
+
\ No newline at end of file
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
new file mode 100644
index 0000000..03423bf
--- /dev/null
+++ b/android/res/values/strings.xml
@@ -0,0 +1,5 @@
+
+
+ SalesforceReact
+ com.salesforce.androidsdk.reactnative
+
\ No newline at end of file
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
new file mode 100644
index 0000000..301c741
--- /dev/null
+++ b/android/settings.gradle.kts
@@ -0,0 +1,15 @@
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+dependencyResolutionManagement {
+ @Suppress("UnstableApiUsage")
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
diff --git a/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactPackage.kt b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactPackage.kt
new file mode 100644
index 0000000..417635d
--- /dev/null
+++ b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactPackage.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2024-present, salesforce.com, inc.
+ * All rights reserved.
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of salesforce.com, inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission of salesforce.com, inc.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.salesforce.androidsdk.reactnative.app
+
+import com.facebook.react.BaseReactPackage
+import com.facebook.react.bridge.NativeModule
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.module.model.ReactModuleInfo
+import com.facebook.react.module.model.ReactModuleInfoProvider
+import com.facebook.react.uimanager.ViewManager
+import com.salesforce.androidsdk.reactnative.bridge.MobileSyncReactBridge
+import com.salesforce.androidsdk.reactnative.bridge.SalesforceNetReactBridge
+import com.salesforce.androidsdk.reactnative.bridge.SalesforceOauthReactBridge
+import com.salesforce.androidsdk.reactnative.bridge.SmartStoreReactBridge
+
+class SalesforceReactPackage : BaseReactPackage() {
+
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
+ return when (name) {
+ "SFOauthReactBridge" -> SalesforceOauthReactBridge(reactContext)
+ "SFNetReactBridge" -> SalesforceNetReactBridge(reactContext)
+ "SFSmartStoreReactBridge" -> SmartStoreReactBridge(reactContext)
+ "SFMobileSyncReactBridge" -> MobileSyncReactBridge(reactContext)
+ else -> null
+ }
+ }
+
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
+ return ReactModuleInfoProvider {
+ mapOf(
+ "SFOauthReactBridge" to ReactModuleInfo(
+ "SFOauthReactBridge", "SFOauthReactBridge", false, false, false, true
+ ),
+ "SFNetReactBridge" to ReactModuleInfo(
+ "SFNetReactBridge", "SFNetReactBridge", false, false, false, true
+ ),
+ "SFSmartStoreReactBridge" to ReactModuleInfo(
+ "SFSmartStoreReactBridge", "SFSmartStoreReactBridge", false, false, false, true
+ ),
+ "SFMobileSyncReactBridge" to ReactModuleInfo(
+ "SFMobileSyncReactBridge", "SFMobileSyncReactBridge", false, false, false, true
+ ),
+ )
+ }
+ }
+
+ // Also provide createNativeModules for legacy interop in composite builds where the
+ // TurboModule JNI classloader check may fail due to different classloaders.
+ override fun createNativeModules(reactContext: ReactApplicationContext): List {
+ return listOf(
+ SalesforceOauthReactBridge(reactContext),
+ SalesforceNetReactBridge(reactContext),
+ SmartStoreReactBridge(reactContext),
+ MobileSyncReactBridge(reactContext),
+ )
+ }
+
+ override fun createViewManagers(reactContext: ReactApplicationContext): List> {
+ return emptyList()
+ }
+}
diff --git a/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactSDKManager.java b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactSDKManager.java
new file mode 100644
index 0000000..9cc795c
--- /dev/null
+++ b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactSDKManager.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2014-present, salesforce.com, inc.
+ * All rights reserved.
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of salesforce.com, inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission of salesforce.com, inc.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.salesforce.androidsdk.reactnative.app;
+
+import static androidx.annotation.VisibleForTesting.PROTECTED;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+
+import com.facebook.react.ReactPackage;
+import com.salesforce.androidsdk.mobilesync.app.MobileSyncSDKManager;
+import com.salesforce.androidsdk.reactnative.ui.SalesforceReactActivity;
+import com.salesforce.androidsdk.ui.LoginActivity;
+import com.salesforce.androidsdk.util.EventsObservable;
+import com.salesforce.androidsdk.util.EventsObservable.EventType;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * SDK Manager for all react native applications
+ */
+public class SalesforceReactSDKManager extends MobileSyncSDKManager {
+
+ /**
+ * Protected constructor.
+ *
+ * @param context Application context.
+ * @param mainActivity Activity that should be launched after the login flow.
+ * @param loginActivity Login activity.
+ */
+ protected SalesforceReactSDKManager(Context context, Class extends Activity> mainActivity,
+ Class extends Activity> loginActivity) {
+ super(context, mainActivity, loginActivity, null);
+ }
+
+ private static void init(Context context, Class extends Activity> mainActivity,
+ Class extends Activity> loginActivity) {
+ if (INSTANCE == null) {
+ INSTANCE = new SalesforceReactSDKManager(context, mainActivity, loginActivity);
+ }
+
+ // Upgrade to the latest version.
+ SalesforceReactUpgradeManager.getInstance().upgrade();
+ initInternal(context);
+ EventsObservable.get().notifyEvent(EventType.AppCreateComplete);
+ }
+
+ /**
+ * Initializes components required for this class
+ * to properly function. This method should be called
+ * by react native apps using the Salesforce Mobile SDK.
+ *
+ * @param context Application context.
+ * @param mainActivity Activity that should be launched after the login flow.
+ */
+ public static void initReactNative(Context context, Class extends Activity> mainActivity) {
+ SalesforceReactSDKManager.init(context, mainActivity, LoginActivity.class);
+ }
+
+ /**
+ * Initializes components required for this class
+ * to properly function. This method should be called
+ * by react native apps using the Salesforce Mobile SDK.
+ *
+ * @param context Application context.
+ * @param mainActivity Activity that should be launched after the login flow.
+ * @param loginActivity Login activity.
+ * @noinspection unused
+ */
+ public static void initReactNative(Context context, Class extends Activity> mainActivity,
+ Class extends Activity> loginActivity) {
+ SalesforceReactSDKManager.init(context, mainActivity, loginActivity);
+ }
+
+ /**
+ * Returns a singleton instance of this class.
+ *
+ * @return Singleton instance of SalesforceReactSDKManager.
+ */
+ @NonNull
+ public static SalesforceReactSDKManager getInstance() {
+ if (INSTANCE != null) {
+ return (SalesforceReactSDKManager) INSTANCE;
+ } else {
+ throw new RuntimeException("Applications need to call SalesforceReactSDKManager.init() first.");
+ }
+ }
+
+ @NonNull
+ @Override
+ public String getAppType() {
+ return "ReactNative";
+ }
+
+ /**
+ * Call this method when setting up ReactInstanceManager
+ *
+ * @return ReactPackage for this application
+ */
+ public ReactPackage getReactPackage() {
+ return new SalesforceReactPackage();
+ }
+
+ @NonNull
+ @Override
+ @VisibleForTesting(otherwise = PROTECTED)
+ public Map getDevActions(
+ @NonNull final Activity frontActivity
+ ) {
+ Map devActions = super.getDevActions(frontActivity);
+ devActions.put(
+ "React Native Dev Support",
+ () -> ((SalesforceReactActivity) frontActivity).showReactDevOptionsDialog()
+ );
+
+ return devActions;
+ }
+}
diff --git a/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactUpgradeManager.java b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactUpgradeManager.java
new file mode 100644
index 0000000..5c9ef5d
--- /dev/null
+++ b/android/src/main/java/com/salesforce/androidsdk/reactnative/app/SalesforceReactUpgradeManager.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014-present, salesforce.com, inc.
+ * All rights reserved.
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of salesforce.com, inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission of salesforce.com, inc.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.salesforce.androidsdk.reactnative.app;
+
+import com.salesforce.androidsdk.mobilesync.app.MobileSyncUpgradeManager;
+
+/**
+ * This class handles upgrades from one version to another.
+ *
+ * @author bhariharan
+ */
+public class SalesforceReactUpgradeManager extends MobileSyncUpgradeManager {
+
+ private static SalesforceReactUpgradeManager INSTANCE = null;
+
+ /**
+ * Returns an instance of this class.
+ *
+ * @return Instance of this class.
+ */
+ public static synchronized SalesforceReactUpgradeManager getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE = new SalesforceReactUpgradeManager();
+ }
+ return INSTANCE;
+ }
+
+ @Override
+ public void upgrade() {
+ super.upgrade();
+ }
+}
diff --git a/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/MobileSyncReactBridge.kt b/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/MobileSyncReactBridge.kt
new file mode 100644
index 0000000..b1ffa5d
--- /dev/null
+++ b/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/MobileSyncReactBridge.kt
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2015-present, salesforce.com, inc.
+ * All rights reserved.
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of salesforce.com, inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission of salesforce.com, inc.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.salesforce.androidsdk.reactnative.bridge
+
+import com.facebook.react.bridge.Callback
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.bridge.ReactContextBaseJavaModule
+import com.facebook.react.bridge.ReactMethod
+import com.facebook.react.bridge.ReadableMap
+import com.facebook.react.turbomodule.core.interfaces.TurboModule
+import com.salesforce.androidsdk.mobilesync.manager.SyncManager
+import com.salesforce.androidsdk.mobilesync.target.SyncDownTarget
+import com.salesforce.androidsdk.mobilesync.target.SyncUpTarget
+import com.salesforce.androidsdk.mobilesync.util.SyncOptions
+import com.salesforce.androidsdk.mobilesync.util.SyncState
+import com.salesforce.androidsdk.reactnative.util.SalesforceReactLogger
+import org.json.JSONObject
+
+class MobileSyncReactBridge(reactContext: ReactApplicationContext) :
+ ReactContextBaseJavaModule(reactContext), TurboModule {
+
+ companion object {
+ // Keys in json from/to javascript
+ const val TARGET = "target"
+ const val SOUP_NAME = "soupName"
+ const val OPTIONS = "options"
+ const val SYNC_ID = "syncId"
+ const val SYNC_NAME = "syncName"
+ const val TAG = "SFMobileSyncReactBridge"
+ }
+
+ override fun getName(): String = TAG
+
+ /**
+ * Native implementation of syncUp
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun syncUp(args: ReadableMap, callback: Callback) {
+ // Parse args
+ val target = JSONObject(ReactBridgeHelper.toJavaMap(args.getMap(TARGET)))
+ val soupName = args.getString(SOUP_NAME)!!
+ val options = JSONObject(ReactBridgeHelper.toJavaMap(args.getMap(OPTIONS)))
+ val syncName = if (args.hasKey(SYNC_NAME)) args.getString(SYNC_NAME) else null
+ try {
+ val syncManager = getSyncManager(args)
+ syncManager.syncUp(
+ SyncUpTarget.fromJSON(target),
+ SyncOptions.fromJSON(options),
+ soupName,
+ syncName,
+ object : SyncManager.SyncUpdateCallback {
+ override fun onUpdate(sync: SyncState) {
+ handleSyncUpdate(sync, callback)
+ }
+ }
+ )
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "syncUp call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Native implementation of syncDown
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun syncDown(args: ReadableMap, callback: Callback) {
+ // Parse args
+ val target = JSONObject(ReactBridgeHelper.toJavaMap(args.getMap(TARGET)))
+ val soupName = args.getString(SOUP_NAME)!!
+ val options = JSONObject(ReactBridgeHelper.toJavaMap(args.getMap(OPTIONS)))
+ val syncName = if (args.hasKey(SYNC_NAME)) args.getString(SYNC_NAME) else null
+ try {
+ val syncManager = getSyncManager(args)
+ syncManager.syncDown(
+ SyncDownTarget.fromJSON(target),
+ SyncOptions.fromJSON(options),
+ soupName,
+ syncName,
+ object : SyncManager.SyncUpdateCallback {
+ override fun onUpdate(sync: SyncState) {
+ handleSyncUpdate(sync, callback)
+ }
+ }
+ )
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "syncDown call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Native implementation of getSyncStatus
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun getSyncStatus(args: ReadableMap, callback: Callback) {
+ try {
+ val syncManager = getSyncManager(args)
+ val sync = when {
+ args.hasKey(SYNC_ID) && !args.isNull(SYNC_ID) ->
+ syncManager.getSyncStatus(args.getInt(SYNC_ID).toLong())
+ args.hasKey(SYNC_NAME) && !args.isNull(SYNC_NAME) ->
+ syncManager.getSyncStatus(args.getString(SYNC_NAME))
+ else ->
+ throw SyncManager.MobileSyncException("neither $SYNC_ID nor $SYNC_NAME were specified")
+ }
+ ReactBridgeHelper.invokeSuccess(callback, sync?.asJSON())
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "getSyncStatusByName call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Native implementation of deleteSync
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun deleteSync(args: ReadableMap, callback: Callback) {
+ try {
+ val syncManager = getSyncManager(args)
+ when {
+ args.hasKey(SYNC_ID) && !args.isNull(SYNC_ID) ->
+ syncManager.deleteSync(args.getInt(SYNC_ID).toLong())
+ args.hasKey(SYNC_NAME) && !args.isNull(SYNC_NAME) ->
+ syncManager.deleteSync(args.getString(SYNC_NAME))
+ else ->
+ throw SyncManager.MobileSyncException("neither $SYNC_ID nor $SYNC_NAME were specified")
+ }
+ ReactBridgeHelper.invokeSuccess(callback)
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "deleteSyncById call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Native implementation of reSync
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun reSync(args: ReadableMap, callback: Callback) {
+ try {
+ val syncManager = getSyncManager(args)
+ val syncUpdateCallback = object : SyncManager.SyncUpdateCallback {
+ override fun onUpdate(sync: SyncState) {
+ handleSyncUpdate(sync, callback)
+ }
+ }
+ when {
+ args.hasKey(SYNC_ID) && !args.isNull(SYNC_ID) ->
+ syncManager.reSync(args.getInt(SYNC_ID).toLong(), syncUpdateCallback)
+ args.hasKey(SYNC_NAME) && !args.isNull(SYNC_NAME) ->
+ syncManager.reSync(args.getString(SYNC_NAME)!!, syncUpdateCallback)
+ else ->
+ throw SyncManager.MobileSyncException("neither $SYNC_ID nor $SYNC_NAME were specified")
+ }
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "reSync call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Native implementation of cleanResyncGhosts
+ * @param args
+ * @param callback
+ */
+ @ReactMethod
+ fun cleanResyncGhosts(args: ReadableMap, callback: Callback) {
+ // Parse args
+ val syncId = args.getInt(SYNC_ID).toLong()
+ try {
+ val syncManager = getSyncManager(args)
+ syncManager.cleanResyncGhosts(syncId, object : SyncManager.CleanResyncGhostsCallback {
+ override fun onSuccess(numRecords: Int) {
+ ReactBridgeHelper.invokeSuccess(callback, numRecords)
+ }
+
+ override fun onError(e: Exception?) {
+ ReactBridgeHelper.invokeError(callback, e?.toString() ?: "Unknown error")
+ }
+ })
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "cleanResyncGhosts call failed", e)
+ ReactBridgeHelper.invokeError(callback, e.toString())
+ }
+ }
+
+ /**
+ * Sync update handler
+ * @param sync
+ * @param callback
+ */
+ private fun handleSyncUpdate(sync: SyncState, callback: Callback) {
+ try {
+ when (sync.status) {
+ SyncState.Status.NEW -> {}
+ SyncState.Status.RUNNING -> {}
+ SyncState.Status.DONE ->
+ ReactBridgeHelper.invokeSuccess(callback, sync.asJSON())
+ SyncState.Status.FAILED ->
+ ReactBridgeHelper.invokeError(callback, sync.asJSON().toString())
+ else -> {}
+ }
+ } catch (e: Exception) {
+ SalesforceReactLogger.e(TAG, "handleSyncUpdate call failed", e)
+ }
+ }
+
+ /**
+ * Return sync manager to use
+ * @param args Arguments passed to the bridge
+ * @return
+ */
+ @Throws(Exception::class)
+ private fun getSyncManager(args: ReadableMap): SyncManager {
+ val smartStore = SmartStoreReactBridge.getSmartStore(args)
+ return SyncManager.getInstance(null, null, smartStore)
+ }
+}
diff --git a/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/ReactBridgeHelper.java b/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/ReactBridgeHelper.java
new file mode 100644
index 0000000..01bfac3
--- /dev/null
+++ b/android/src/main/java/com/salesforce/androidsdk/reactnative/bridge/ReactBridgeHelper.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2015-present, salesforce.com, inc.
+ * All rights reserved.
+ * Redistribution and use of this software in source and binary forms, with or
+ * without modification, are permitted provided that the following conditions
+ * are met:
+ * - Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of salesforce.com, inc. nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission of salesforce.com, inc.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.salesforce.androidsdk.reactnative.bridge;
+
+import com.facebook.react.bridge.Callback;
+import com.facebook.react.bridge.ReadableArray;
+import com.facebook.react.bridge.ReadableMap;
+import com.facebook.react.bridge.ReadableMapKeySetIterator;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ReactBridgeHelper {
+
+ /**
+ * Invokes callback with success result using single-callback pattern: callback(null, result)
+ */
+ public static void invokeSuccess(Callback callback, JSONObject json) {
+ callback.invoke(null, json == null ? null : json.toString());
+ }
+
+ public static void invokeSuccess(Callback callback, JSONArray json) {
+ callback.invoke(null, json == null ? null : json.toString());
+ }
+
+ public static void invokeSuccess(Callback callback, String value) {
+ callback.invoke(null, "\"" + value + "\"");
+ }
+
+ public static void invokeSuccess(Callback callback, boolean value) {
+ callback.invoke(null, "" + value);
+ }
+
+ public static void invokeSuccess(Callback callback, int value) {
+ callback.invoke(null, "" + value);
+ }
+
+ /**
+ * Invokes callback with no result (void success): callback(null)
+ */
+ public static void invokeSuccess(Callback callback) {
+ callback.invoke(null, "null");
+ }
+
+ /**
+ * Invokes callback with error: callback(errorMessage)
+ */
+ public static void invokeError(Callback callback, String error) {
+ callback.invoke(error);
+ }
+
+ public static Map toJavaMap(ReadableMap map) {
+ Map result = new HashMap<>();
+ ReadableMapKeySetIterator iterator = map.keySetIterator();
+ while (iterator.hasNextKey()) {
+ String key = iterator.nextKey();
+ switch (map.getType(key)) {
+ case Null:
+ result.put(key, null);
+ break;
+ case Boolean:
+ result.put(key, map.getBoolean(key));
+ break;
+ case Number:
+ result.put(key, map.getDouble(key));
+ break;
+ case String:
+ result.put(key, map.getString(key));
+ break;
+ case Map:
+ result.put(key, toJavaMap(map.getMap(key)));
+ break;
+ case Array:
+ result.put(key, toJavaList(map.getArray(key)));
+ break;
+ }
+ }
+ return result;
+ }
+
+ public static Map toJavaStringStringMap(ReadableMap map) {
+ Map result = new HashMap<>();
+ ReadableMapKeySetIterator iterator = map.keySetIterator();
+ while (iterator.hasNextKey()) {
+ String key = iterator.nextKey();
+ switch (map.getType(key)) {
+ case String:
+ result.put(key, map.getString(key));
+ break;
+ default:
+ break;
+ }
+ }
+ return result;
+ }
+
+ public static Map> toJavaStringMapMap(ReadableMap map) {
+ Map> result = new HashMap<>();
+ ReadableMapKeySetIterator iterator = map.keySetIterator();
+ while (iterator.hasNextKey()) {
+ String key = iterator.nextKey();
+ switch (map.getType(key)) {
+ case Map:
+ result.put(key, toJavaStringStringMap(map.getMap(key)));
+ break;
+ default:
+ break;
+ }
+ }
+ return result;
+ }
+
+
+ public static List toJavaStringList(ReadableArray array) {
+ List result = new ArrayList<>();
+ for (int i = 0; i toJavaList(ReadableArray array) {
+ List