Skip to content

Conversation

@ValentinPostindustria
Copy link
Collaborator

@ValentinPostindustria ValentinPostindustria commented Nov 17, 2025

Closes #33.

Breaking changes:

  • Remove app path parameter.
  • Add tenant and originSlug query parameters.
  • Make host dynamic and apply path v2.

Other features:

  • Support apiKey.
  • Move all configuration parameters in Config class and reuse it everywhere.
  • Separate GoogleAdIdManager and LocalStorage logic from the network client.
  • Rename Client to NetworkClient.
  • Move hash logic to separate TypeHasher class.
  • Separate network interceptors.
  • Demo apps are built using local SDK.
  • Unit tests with mock web server.
  • Build WebView for user agent only once and cache the result.
  • Apply automatic IDEA aligning.

Remove `app` path parameter. Add `tenant` and `originSlug` parameters. Make host dynamic and apply path `v2`. Move all configuration parameters in Config class and reuse it everywhere. Separate `GoogleAdIdManager` and `LocalStorage` logic from the network client. Rename `Client` to `NetworkClient`. Move hash logic to separate `TypeHasher` class. Separate network interceptors. Refactor SDK code.
Support secret api keys. Fetch user agent only once. Write unit tests with the mock web server.
@ValentinPostindustria ValentinPostindustria marked this pull request as ready for review November 21, 2025 09:07
ValentinPostindustria and others added 15 commits December 18, 2025 12:35
Remove custom network Adapter. Use native Retrofit adapter. Add Kotlin suspension.
Migrate from TypeHasher to IdentifiersEncoder. Add all identifier types. Cover with unit tests.
Use callbacks API. Rewrite demo apps to make the examples more readable. Use shorter logs.  Create Optable SDK instance once during application creation and reuse everywhere. Move fragments to one folder.
Add missed "reg" query param. Make Consents mutable. Provide `receiveGaidAutomatically` property. Refactor main methods javadoc.
Copy link
Collaborator

@justadreamer justadreamer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we are almost there, a couple minor changes mentioned in the comments:

  • we need to preserve original targetingData instead of completely transforming it to gamTargetingKeywords and ortbJson - it may still be used for other purposes
  • we need to make sure we use keyspace, not provider as a key in the gamTargetingKeywords - maybe I looked in the wrong place - it seemed to me provider was used
  • please make sure that in all cases when skipAdvertisingIdentifer==false we obtain gaid automatically

} else null

val gaid = if (gaid) {
adIdManager.getId()
Copy link
Collaborator

@justadreamer justadreamer Jan 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we pull gaid automatically in case of any identify call when skipAdvertisingIdDetection == false?

val receiveGaidAutomatically: Boolean = false,
) {

private val cachedEnrichedIds: List<String> by lazy { IdentifiersEncoder.encode(this) }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is "enriched ids" their original term?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No. It's a new field, it wasn't before. I took it from iOS.
They called it: idList and type-prefixed identifiers. So I renamed to EIDs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Rework Optable Real-time APIs configuration and request forming

4 participants