From 50364749f68954f2decb93759bbbe4c008a2ac99 Mon Sep 17 00:00:00 2001 From: Egor Kitselyuk Date: Thu, 8 Oct 2026 16:45:53 +0300 Subject: [PATCH 1/2] MOBILE-389: Add disableTrackingIds support --- .../java/com/mindboxsdk/MindboxSdkModule.kt | 3 ++ src/__tests__/index.test.ts | 48 +++++++++++++++++++ src/index.tsx | 7 ++- src/types/InitializationData.ts | 11 +++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/mindboxsdk/MindboxSdkModule.kt b/android/src/main/java/com/mindboxsdk/MindboxSdkModule.kt index 5797f5d..aada3c7 100644 --- a/android/src/main/java/com/mindboxsdk/MindboxSdkModule.kt +++ b/android/src/main/java/com/mindboxsdk/MindboxSdkModule.kt @@ -65,6 +65,9 @@ class MindboxSdkModule(private val reactContext: ReactApplicationContext) : Reac if (payload.has("shouldIncludeVersionCode")) { configurationBuilder.shouldIncludeVersionCode(payload.optBoolean("shouldIncludeVersionCode", true)) } + if (payload.has("disableTrackingIds")) { + configurationBuilder.disableTrackingIds(payload.optBoolean("disableTrackingIds", false)) + } val configuration = configurationBuilder.build() val handler = Handler(context.mainLooper) diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 9c1a85a..11299be 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -545,6 +545,54 @@ describe('Testing Mindbox RN SDK', () => { expect(JSON.parse(calledWith)).not.toHaveProperty('shouldIncludeVersionCode') }) + it('initialize passes disableTrackingIds true to native', async () => { + const { + NativeModules: { MindboxSdk: MindboxSdkNative }, + } = require('react-native') + const MindboxSdk = require('../index').default + + expect.assertions(1) + + await MindboxSdk.initialize({ + ...initializationData, + disableTrackingIds: true, + }) + + const calledWith = (MindboxSdkNative.initialize as jest.Mock).mock.calls.slice(-1)[0][0] + expect(JSON.parse(calledWith)).toMatchObject({ disableTrackingIds: true }) + }) + + it('initialize passes disableTrackingIds false to native', async () => { + const { + NativeModules: { MindboxSdk: MindboxSdkNative }, + } = require('react-native') + const MindboxSdk = require('../index').default + + expect.assertions(1) + + await MindboxSdk.initialize({ + ...initializationData, + disableTrackingIds: false, + }) + + const calledWith = (MindboxSdkNative.initialize as jest.Mock).mock.calls.slice(-1)[0][0] + expect(JSON.parse(calledWith)).toMatchObject({ disableTrackingIds: false }) + }) + + it('initialize does not include disableTrackingIds in payload when not provided', async () => { + const { + NativeModules: { MindboxSdk: MindboxSdkNative }, + } = require('react-native') + const MindboxSdk = require('../index').default + + expect.assertions(1) + + await MindboxSdk.initialize(initializationData) + + const calledWith = (MindboxSdkNative.initialize as jest.Mock).mock.calls.slice(-1)[0][0] + expect(JSON.parse(calledWith)).not.toHaveProperty('disableTrackingIds') + }) + it('getDeviceUUID method works correctly', async () => { const MindboxSdk = require('../index').default diff --git a/src/index.tsx b/src/index.tsx index c2c8273..827f65f 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -84,6 +84,7 @@ class MindboxSdkClass { * previousUuid: '', * operationsDomain: 'anonymizer.example.com', * shouldIncludeVersionCode: false, // Android only (ignored on iOS). Default value is true + * disableTrackingIds: true, // Android only (ignored on iOS). Default value is false * }); */ public async initialize(initializationData: InitializationData) { @@ -99,7 +100,7 @@ class MindboxSdkClass { throw new Error('Wrong initialization data!') } - const { domain, endpointId, subscribeCustomerIfCreated, shouldCreateCustomer, previousInstallId, previousUuid, operationsDomain, shouldIncludeVersionCode } = initializationData + const { domain, endpointId, subscribeCustomerIfCreated, shouldCreateCustomer, previousInstallId, previousUuid, operationsDomain, shouldIncludeVersionCode, disableTrackingIds } = initializationData if (!domain || !endpointId) { this._initializing = false @@ -135,6 +136,10 @@ class MindboxSdkClass { payload.shouldIncludeVersionCode = shouldIncludeVersionCode } + if (typeof disableTrackingIds !== 'undefined') { + payload.disableTrackingIds = disableTrackingIds + } + try { const payloadString = JSON.stringify(payload) this._initialized = await MindboxSdkNative.initialize(payloadString) diff --git a/src/types/InitializationData.ts b/src/types/InitializationData.ts index 46789ac..3d79155 100644 --- a/src/types/InitializationData.ts +++ b/src/types/InitializationData.ts @@ -12,4 +12,15 @@ export type InitializationData = { * Default value is true. */ shouldIncludeVersionCode?: boolean + /** + * Android only, ignored on iOS. Turns off collection of the device tracking identifier + * (GAID from Google Mobile Services, OAID from Huawei Mobile Services) that the SDK otherwise + * reports to Mindbox together with the application events. Pass true to stop the collection. + * This is the only supported way to opt out: removing the AD_ID permission affects the whole app + * and does not stop OAID collection. The SDK never requests a runtime permission for it, and + * RuStore provides no tracking identifier. The value is applied on every initialization, so it + * can be turned on or off in a later app version. + * Default value is false (the identifier is collected). + */ + disableTrackingIds?: boolean } From f1621a737529d4bd3650d3df1fd7ea97264fca5d Mon Sep 17 00:00:00 2001 From: Egor Kitselyuk Date: Thu, 8 Oct 2026 16:48:03 +0300 Subject: [PATCH 2/2] MOBILE-389: Document when disableTrackingIds takes effect --- src/types/InitializationData.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/types/InitializationData.ts b/src/types/InitializationData.ts index 3d79155..f6f83c0 100644 --- a/src/types/InitializationData.ts +++ b/src/types/InitializationData.ts @@ -19,7 +19,9 @@ export type InitializationData = { * This is the only supported way to opt out: removing the AD_ID permission affects the whole app * and does not stop OAID collection. The SDK never requests a runtime permission for it, and * RuStore provides no tracking identifier. The value is applied on every initialization, so it - * can be turned on or off in a later app version. + * can be turned on or off in a later app version. A changed value takes effect once initialize + * has run in that version; native work started earlier (push services set up at app start, + * background token refresh) still uses the previous value. * Default value is false (the identifier is collected). */ disableTrackingIds?: boolean