Android SDK reference
The Android SDK's classes, members, hooks and texts, as its Kotlin and XML sources declare them. The steps are in the Android guide. Countdowns, promo codes, polls, quizzes, ratings and reactions are drawn. A visitor’s answers are sent to the API and counted there.
Coordinates and requirements
site.lempert.taleart:android-sdk:0.1.1
site.lempert.taleart:mobile-sdk:0.1.1- Maven Central, group
site.lempert.taleart, version 0.1.1.android-sdkdepends onmobile-sdk. - Minimum Android 7.0 (API 24). Kotlin; the Compose UI comes with the SDK.
- The INTERNET permission, which the app declares.
- A host with a lifecycle for
TaleartView: a ComponentActivity, an AppCompatActivity or a Fragment.
TaleartSdk
object TaleartSdk in site.lempert.taleart.sdk. Its configuration is shared by every view.
| Member | Type | Default | Meaning |
|---|---|---|---|
init(config:) | fun (TaleartConfig) | (required) | Sets the SDK’s configuration for every view. Call it once, in Application.onCreate (Android) or at launch (iOS), before the views show. On iOS it is doInit(config:), as Kotlin’s init is named in Swift. |
config | TaleartConfig | the defaults | The configuration in use: the last init, or the defaults. |
locale | String | (read-only) | The SDK’s locale: the configured one, else the device’s. |
translate | Translate | (read-only) | The text lookup of the SDK’s configuration. |
TaleartConfig
The options of TaleartSdk.init. Every field is optional.
| Field | Type | Default | Meaning |
|---|---|---|---|
apiUrl | String | "" (empty) | The TaleArt API origin, such as https://api.example.com. Set it: a native app has no page to take it from, and an empty value shows nothing. A view’s own apiUrl wins. |
locale | String | "" (device locale) | The SDK’s locale, BCP 47 such as he-IL. Empty: the device’s locale, then English. |
strings | Map<String, Map<String, String>> | empty | Texts per locale, keyed by the locale (he-IL, or its language he), then by string key. |
stringsForEveryLocale | Map<String, String> | empty | Texts for every locale, looked up after the locale’s own. |
listener | TaleartListener? | null | The hooks of every view. It runs after a view’s own listener. |
externalUserId | String? | null | The viewer’s external user ID, for groups targeted to user lists. Sent with each zone read in its own header (X-TaleArt-External-User-Id, base64url), never in a URL; the API does not keep it. Null sends none. |
tags | List<String> | empty | The viewer’s targeting tags. A group whose tags do not pass its rule (any or all of them) is left out on the device; the tags are never sent. Empty: every group shows. |
properties | Map<String, Any?>? | null (every group shows) | The viewer’s properties: the values a tale group’s audience rule reads (Swift: [String: Any]?). A flat map of name to a String, a number, a Boolean or a List of Strings; pass a date as epoch milliseconds. A name starts with a letter and uses letters, digits, _, . or -, up to 64 characters, and is case-sensitive. At most 50 properties, a string at most 256 characters, a list at most 50 items; an invalid entry is ignored. Null: the app passed none, so every audience rule passes, as with no tags. Set: a group whose rule does not pass is left out on the device, together with its tags, and the properties are never sent (not in a header, a URL or an analytics event). An empty map means the app knows nothing about the viewer: neq, notIn and notExists pass, and every other condition fails. |
fallback | FallbackMode | FallbackMode.None | What a view shows when its zone fails to load. None: nothing, as before. Message: the translated load.failed text and a load.retry button that reads the zone again. A view’s own fallbackView (Android) or fallbackViewController (iOS) wins over both. |
frequency | FrequencyRule? | null (no cap) | How often a viewer sees a tale group. Once: hide a group after its first view. Daily: at most one view per 24 hours. Weekly: one per 7 days. Count(views): hide after N views, N from 1 to 50. A view is one opening of the viewer on a group, counted only on this device in the SDK’s store, never sent to TaleArt. Groups over the cap leave the display; when none remain, nothing is shown. An out-of-range Count throws IllegalArgumentException when it is built. |
analytics | Boolean | true | false turns the SDK’s analytics events off: impression, open, view and click. Per zone they are queued and sent every 5 seconds, when 20 are queued, and when the app goes to the background, in requests of at most 50. A request is retried once; a failure is silent. Each event carries only its type, the group id, the tale id (view and click only) and the time, with the zone key and the anonymous visitor id header. A view’s own setting wins over it. |
layoutDirection | String? | null (the platform’s direction) | `ltr` or `rtl` lays every SDK view out in that direction, whatever the device’s language: the bar’s items and scroll start, the viewer’s progress and tap zones, the banner’s arrows, the poll and rating layouts. Null, or any other value, follows the platform (Hebrew and Arabic are right to left). A promo code and a countdown’s digits stay left to right in both. |
TaleartView (XML and code)
A view that shows one zone, the Android counterpart of <taleart-view>. Its XML attributes:
| Attribute | Format | Default | Meaning |
|---|---|---|---|
app:taleartZoneKey | string | (none) | The zone’s key, tak_…. Without it the view shows nothing. |
app:taleartApiUrl | string | "" (empty) | The API origin for this view. Empty uses the one of TaleartSdk.init. |
app:taleartAnalytics | boolean | (none: follows the SDK) | false turns this view’s analytics events off, whatever TaleartConfig.analytics says. |
Its members in code:
| Member | Type | Default | Meaning |
|---|---|---|---|
zoneKey | String | "" | The zone’s key. The view reads the zone once it has a key and an API origin. |
apiUrl | String | "" | The API origin for this view. Empty uses the one of TaleartSdk.init. |
locale | String? | null | This view’s locale. Null uses the SDK’s. |
strings | Map<String, Map<String, String>>? | null | This view’s texts per locale, over the SDK’s. |
listener | TaleartListener? | null | This view’s hooks. They run before the SDK’s listener. |
client | DeliveryClient | the process’s shared client | The client the next read uses. A client you set belongs to you. |
opensViewer | Boolean | true | A tap on a group opens the full-screen viewer. False: you handle the tap in onGroupClickListener. |
onGroupClickListener | ((DeliveryTaleGroup) -> Unit)? | null | Called with the tapped group, before the viewer opens. |
onErrorListener | ((ZoneResult.Failure) -> Unit)? | null | Called with each failed read. The view then shows nothing. |
fallbackView | View? | null | A host View shown instead of the zone when the read fails. It wins over TaleartConfig.fallback. In Java: setFallbackView(View). |
analytics | Boolean? | null | false turns this view’s analytics events off; null follows TaleartConfig.analytics. |
properties | Map<String, Any?>? | null (the SDK’s) | This view’s viewer properties, replacing TaleartConfig.properties for this view; null uses the SDK’s. Setting it reads the view’s zone again at once. In Java: setProperties(map). There is no XML attribute for it. |
controller | TaleartZoneController | (val) | The zone the view shows. It keeps the zone when the view is detached and attached again. |
hostsComposition | Boolean | (val) | True once the view has a window and a lifecycle owner. |
configure | fun (apiUrl, zoneKey) | (function) | Sets the API origin and the zone’s key in one call. |
reload | fun () | (function) | Reads the zone again. The display stays until the new zone arrives. |
TaleartZone (Compose)
The composable in site.lempert.taleart.sdk.ui. Its first two parameters have no default.
| Parameter | Type | Default | Meaning |
|---|---|---|---|
apiUrl | String | (required) | The API origin. Empty uses the one of TaleartSdk.init. |
zoneKey | String | (required) | The zone’s key, tak_…. |
modifier | Modifier | Modifier | The layout modifier, such as fillMaxWidth(). |
onGroupClick | (DeliveryTaleGroup) -> Unit | {} | Called with the tapped group, before the viewer opens. |
onError | (ZoneResult.Failure) -> Unit | {} | Called with each failed read. |
client | DeliveryClient? | null | The client for the zone. Null uses the shared one. |
seenGroups | SeenGroups | rememberSeenGroups() | The groups the viewer has shown; their ring turns to the seen colour. |
titleStyle | TextStyle | TextStyle.Default | The style of a bar item’s title. |
reloadKey | Any? | null | Changing it reads the zone again. |
opensViewer | Boolean | true | False: a tap calls onGroupClick only, and you show the viewer yourself. |
locale | String? | null | This zone’s locale. Null uses the SDK’s. |
strings | Map<String, Map<String, String>>? | null | This zone’s texts per locale, over the SDK’s. |
listener | TaleartListener? | null | This zone’s hooks. They run before the SDK’s listener. |
fallback | (@Composable () -> Unit)? | null | Shown instead of the zone when the read fails. Null: TaleartConfig.fallback decides (nothing, or the message). |
analytics | Boolean? | null | false turns this zone’s analytics events off; null follows TaleartConfig.analytics. |
TaleartTheme
The project's theme as the native SDK reads it. The fields and their rules are the Web SDK's (see Theme and fonts); a field left out or not valid takes its default.
| Field | Type | Default | Meaning |
|---|---|---|---|
ringStyle | RingStyle | Gradient | Gradient, Solid or None: how the unseen ring is drawn. |
ringColors | List<String> | three colours | 1 to 3 colours, #rrggbb. |
seenRingColor | String | #6b7280 | The ring after a group was viewed. |
ringWidth | Int | 2 | 1 to 4 dp. |
cornerRadius | Int? | null | 0 to 32 dp, or the display’s own. |
fontFamily | String? | null | A font list, or the host’s. |
titleColor | String? | null | #rrggbb, or the host’s text colour. |
backgroundColor | String | transparent | #rrggbb, or transparent. |
accentColor | String | #ffffff | The viewer’s progress and buttons; its text is white or near-black, by contrast. |
colorScheme | ColorScheme | Auto | Auto follows the device’s light or dark setting; Light and Dark force it. |
liveColor | String? | null | #rrggbb for the live badge, or the last ring colour. |
successColor | String | #047857 | A right quiz answer; lightened on a dark card until it reads at 4.5:1. |
errorColor | String | #b91c1c | A wrong quiz answer; lightened on a dark card until it reads at 4.5:1. |
Bar settings
The bar display's settings, set in the dashboard on a bar zone's frame. A setting that is missing or not valid takes its default. The layouts, and the settings each one ignores, are described in the guide under Bar layouts.
| Layout | Use | Ignored settings |
|---|---|---|
ring | The default. Each cover sits in a gradient ring with its title under it; the ring turns while a group is unseen and stays grey once it is seen. | None. |
chip | A pill per group: a round cover, its title, and a dot while the group is unseen (the seen pill is muted and has no dot). The pills wrap onto more rows. | shape. The size sets the cover (28, 32 or 40 dp). |
poster | A portrait card per group: the cover fills it, with the title and the tale count under a dark scrim, and a segment for each tale along the top. | shape and size. The card is 112 by 188 dp and has a fixed corner radius. |
stack | The groups overlap in one collapsed pill: up to four round covers and a +N bubble for the rest, with the count of unseen groups beside them. The pill opens the first unseen group. | shape, showTitles, alignment and gap. The size sets the covers (40, 48 or 56 dp). |
| Field | Type | Default | Meaning |
|---|---|---|---|
layout | BarLayout | Ring | ring, chip, poster or stack (see Bar layouts). A missing or unknown value is ring. |
shape | BarShape | Circle | circle or rounded-square: the ring’s and the cover’s shape. |
size | BarSize | Medium | small, medium or large: the cover’s size, 48, 64 or 80 dp in a ring. |
showTitles | Boolean | true | Shows each group’s title under its cover. |
alignment | BarAlignment | Start | start or center: where the items sit when they do not fill the row. |
gap | Int | 12 | Space between items in dp, from 4 to 24. |
Banner settings
The banner display's settings, set in the dashboard on a banner zone's frame. A setting that is missing or not valid takes its default. The variants, and the settings each one ignores, are described in the guide under Banner variants.
| Variant | Use | Ignored settings |
|---|---|---|
carousel | The default. One slide at a time, with the group’s name and a Watch stories button on a scrim, previous and next buttons, dots and autoplay. | None. |
coverflow | The current slide in front, its neighbours turned away at the sides, the far ones smaller and fainter. Swipe, or tap a neighbour. | None. |
peek | The current slide in the middle with the neighbours showing at the edges, like a pager with padding. | None. |
deck | The slides fanned out like a hand of cards. The front card opens its group; a tap on a card behind it brings that card forward. | None. |
sticky | A full-width bar on the card colour, pinned to the bottom of the space its host gives it and clear of the system’s bottom bar: previous and next buttons, the current slide’s round cover and name, and a dismiss button (all 44 dp, 48 dp to touch). Dismissed, it stays hidden until the app restarts. | aspectRatio, showDots and loop. It always loops. |
strip | A continuous marquee of the groups’ covers and names, scrolling at a fixed speed (about 18 seconds a loop) toward the start of the line. A press pauses it; under reduced motion it stops and can be scrolled sideways. | aspectRatio, showDots, loop, autoplay and intervalSeconds. |
| Field | Type | Default | Meaning |
|---|---|---|---|
variant | BannerVariant | Carousel | carousel, coverflow, peek, deck, sticky or strip (see Banner variants). A missing or unknown value is carousel. |
aspectRatio | BannerAspectRatio | Wide (16:9) | 16:9, 3:1 or 1:1: the slides’ width to height (carousel, coverflow, peek and deck). |
autoplay | Boolean | true | Moves to the next slide by itself, until the person touches the banner or prefers reduced motion (not strip). |
intervalSeconds | Int | 5 | Seconds each slide shows while autoplaying, from 3 to 15 (not strip). |
showDots | Boolean | true | A dot per slide to jump to it (carousel, coverflow, peek and deck). |
loop | Boolean | true | After the last slide, goes back to the first (carousel, coverflow, peek and deck). |
Poll views
A poll element's view picks how it is drawn: sticker (the default; a missing or unknown view is a sticker), embed, this-or-that, grid or inline. Each option may carry a color (#rrggbb), used only by this-or-that and grid; without one, the theme's colours are used. The embed header is the strings poll.votes and poll.resultsAfterVote (see String keys). The guide shows each view under Poll views.
| View | Use | Option colour |
|---|---|---|
sticker | A small card over the tale (default). | Not used. |
embed | A full-width card with its own results header (the vote total, or the hint before a vote). | Not used. |
this-or-that | Two halves split at the vote's share, with a VS mark on the seam. | Each half: its colour, else the theme's. |
grid | Two large tiles with their shares. | Each tile: its colour, else the theme's. |
inline | Compact rows, in the flow of a page. | Not used. |
TaleartListener
The hooks. Implement the interface and override the methods you need; each default does nothing. A hook that throws is logged, and the SDK goes on. The view's listener runs first, then the SDK's.
| Method | When it fires | Payload | Can handle |
|---|---|---|---|
onLoaded | The zone was read and its display is rendered, or none is needed. | event (zoneKeyPrefix, zoneSlug) | Nothing to return. |
onLoadFailed | The zone could not be read: a refused key, a network failure or a bad answer. | event.error (the message) | Nothing to return. |
onGroupImpression | A group was seen: its bar item was first composed, or a banner slide was first shown in a render. Once per group per load. Native does not measure on-screen visibility, so a group off screen can count too. | event.group | Nothing to return. |
onGroupCapped | A group was hidden by the frequency cap (frequency in TaleartConfig) on a load. Once per group per load. | event.group, event.rule | Nothing to return. |
onPresented | The full-screen viewer opened on a group. | event.group | Nothing to return. |
onDismissed | The viewer closed. event.group is the group it showed last. | event.group | Nothing to return. |
onTaleShown | A tale came on screen in the viewer. | event.group, event.tale | Nothing to return. |
onActionClicked | A call to action was activated, before it opens its URL. | event.url, event.newTab (false on native), event.component, event.group, event.tale | Return true when your app routed the link. Return false (the default) and the system browser opens it. |
onUserInteracted | The server accepted a visitor’s answer to a poll, a quiz, a rating or a reaction. Once per answer; an answer kept from an earlier visit is not reported again. | event.component (type, value: the answer), event.group, event.tale | Nothing to return. |
onComponentEvent | A component of the tale did something: a countdown reached its end (action ended), a promo code was copied (action copied, component.value the code), or the server accepted an answer (action selected, component.value the answer). The listeners hear it; no analytics event is sent for it. | event.component (type, value), event.action, event.group, event.tale | Nothing to return. |
onEvent | Every event, after its named method. | The event | Nothing to return. |
TaleartEvent
What each hook receives. Groups and tales are GroupRef (id, name, index) and TaleRef (id, index, title); a component is ComponentRef (id, type, value).
| Field | Type | Default | Meaning |
|---|---|---|---|
name | String | (required) | The hook’s name without “on”, in lower camel case: loaded, loadFailed, groupImpression, groupCapped, presented, dismissed, taleShown, actionClicked, userInteracted, componentEvent. |
zoneKeyPrefix | String | (required) | The first 8 characters of the zone key. The whole key is never in an event. |
zoneSlug | String | "" | The zone’s slug, such as home-top. Empty when the read failed before the zone came. |
group | GroupRef? | null | The group: its id, name and position in the zone (from 0). |
tale | TaleRef? | null | The tale: its id, position in the group (from 0) and title. |
component | ComponentRef? | null | A call to action or a component: its id, its type (button, image-button, swipe-up, countdown, promo-code, poll, quiz, rating, reaction) and its value: a promo code’s code, or a visitor’s answer (a poll’s option id, a quiz’s answer id, a rating’s number from 0 to 100, a reaction’s emoji). |
action | String? | null | On componentEvent: what the component did. ended (a countdown reached its end), copied (a promo code was copied) or selected (the server accepted a visitor’s answer). Null for other events. |
url | String? | null | The destination of an action that opens one. |
newTab | Boolean | false | Always false on native: links open in the system browser. |
error | String? | null | The message of a failed load. |
rule | FrequencyRule? | null | On groupCapped: the rule the group reached (Once, Daily, Weekly or Count). Null for other events. |
String keys
The texts the SDK shows, with the English default of each. Give your own per locale in strings. A {name}-style value is filled in by the SDK. links.open is native only.
| Key | English default | Where it shows |
|---|---|---|
viewer.close | Close | The viewer’s close button. |
viewer.play | Play | The viewer’s play button. |
viewer.pause | Pause | The viewer’s pause button. |
viewer.previousTale | Previous tale | Moves back one tale. |
viewer.nextTale | Next tale | Moves on one tale. |
viewer.progress | {group}, tale {tale} of {count} | Announces the position in the viewer. |
viewer.taleFallback | Tale {number} | The name of a tale without a title. |
banner.label | Banner | The banner’s name, for screen readers. |
banner.carousel | carousel | The banner’s role, for screen readers. |
banner.slide | slide | The word for one slide. |
banner.slideOf | {index} of {count} | The slide’s position. |
banner.previousSlide | Previous slide | The previous-slide control. |
banner.nextSlide | Next slide | The next-slide control. |
banner.showGroup | Show {name} | A slide’s control, to open its group. |
banner.stopRotation | Stop automatic slide show | The autoplay control, while it plays. |
banner.startRotation | Start automatic slide show | The autoplay control, while it is paused. |
banner.watch | Watch stories | The call to action on a slide. |
banner.dismiss | Dismiss | The sticky banner’s dismiss button; it hides the banner for the rest of the app’s run. |
bar.seen | {name}, seen | A bar item that the viewer has shown. |
bar.loading | Loading stories | The bar’s loading skeleton, announced while the zone is read. |
bar.story | {count} story | The poster layout’s caption for one tale. |
bar.stories | {count} stories | The poster layout’s caption for a group’s tales. |
bar.newStory | {count} new story | The stack layout’s caption for one unseen group. |
bar.newStories | {count} new stories | The stack layout’s caption for the unseen groups. |
load.failed | Stories could not be loaded. | The message of a failed read, with fallback = Message. |
load.retry | Try again | The retry button under the message; it reads the zone again. |
links.open | Open in browser | Native only: a link that leaves the app for the browser. |
countdown.ended | Ended | The text a countdown shows at and after its end, when its endedText is left out. |
countdown.days | Days | The unit under a countdown’s days. |
countdown.hours | Hours | The unit under a countdown’s hours. |
countdown.minutes | Min | The unit under a countdown’s minutes. |
countdown.seconds | Sec | The unit under a countdown’s seconds. |
promo.copy | Copy | The Copy stub of a promo code. |
promo.copied | Copied | The toast after the code reached the clipboard; it clears after four seconds. |
promo.copyFailed | Could not copy. Select the code and copy it yourself. | The status line when the clipboard refused the code. |
poll.voted | You voted {label}. | The live line after a vote, before the shares. |
poll.chose | You chose {label}. | The live line after a press in a preview, before the note. |
poll.previewNotRecorded | Votes are not recorded in the preview. | The note after a press in a preview. |
poll.failed | Your vote could not be sent. Try again. | The live line when the vote was refused or could not be sent; the options stay open. |
poll.votes | {count} votes | The embed view header once voted: the vote total. |
poll.resultsAfterVote | Results appear after you vote | The embed view header before a vote. |
quiz.answered | You answered {label}. | The live line after an answer to a survey (a quiz without a correct answer). |
quiz.right | Right! You answered {label}. | The live line when the answer is the correct one. |
quiz.wrongAnswer | Wrong: you answered {label}. The correct answer is {correct}. | The live line when the answer is wrong. |
quiz.correct | correct answer | Added to the name of the correct answer, once answered (screen readers only). |
quiz.wrong | wrong | Added to the name of the visitor’s wrong answer, once answered (screen readers only). |
quiz.previewNotRecorded | Answers are not recorded in the preview. | The note after a press in a preview. |
quiz.failed | Your answer could not be sent. Try again. | The live line when the answer was refused or could not be sent; the answers stay open. |
rating.sliderLabel | Your rating | The slider’s name, for screen readers. |
rating.valueText | {value} out of {max} | The slider’s value before it is rated. |
rating.ratedValueText | You rated {value} out of {max} | The slider’s value once rated. |
rating.send | Send rating | The screen-reader action that sends the slider’s value (double-tap), and the Web SDK’s hidden send button. |
rating.sent | You rated {value}. | The live line after a rating, before the summary. |
rating.previewRated | You rated {value}. Ratings are not recorded in the preview. | The live line after a release in a preview. |
rating.failed | Your rating could not be sent. Try again. | The live line when the rating was refused or could not be sent; the slider stays open. |
rating.summary | Average {average} from {total} {count} | The count and average once rated. |
rating.singular | rating | The word for one rating, in the summary. |
rating.plural | ratings | The word for several ratings, in the summary. |
reaction.count | Reactions: {count} | Each emoji’s count, read by screen readers once a reaction is tapped. |
reaction.failed | Your reaction could not be sent. Try again. | The live line when the reaction was refused or could not be sent; the emoji stay open. |
Web, Android and iOS side by side
The same SDK in each platform. The Web SDK's page is Install a zone.
| Topic | Web | Android | iOS |
|---|---|---|---|
| Init (once, for every view) | Taleart.init({ … }), or init() from the script’s URL | TaleartSdk.init(TaleartConfig(…)) in Application.onCreate | TaleartSdk.shared.doInit(config: TaleartConfig(…)) at launch |
| Zone key | zone-key="tak_…" on <taleart-view> | app:taleartZoneKey in XML, zoneKey = in TaleartZone | TaleartZoneView(apiUrl:zoneKey:) |
| API origin | api-url (default: the script’s origin) | app:taleartApiUrl; apiUrl in init (required) | apiUrl: in TaleartZoneView; apiUrl in init (required) |
| Locale | locale attribute, init({ locale }), else the page’s lang | TaleartConfig.locale, else TaleartView.locale or TaleartZone(locale =) | TaleartConfig(locale:), else zone.locale |
| Strings | init({ strings }) or the element’s strings property | TaleartConfig.strings and stringsForEveryLocale; TaleartView.strings; TaleartZone(strings =) | TaleartConfig(strings:, stringsForEveryLocale:); zone.strings |
| Hooks | init({ hooks }) or the element’s hooks property | TaleartConfig.listener, or TaleartView.listener, or TaleartZone(listener =) | TaleartConfig(listener:) or zone.listener; subclass TaleartListenerBase |
| Action override (route the link yourself) | hooks.onActionClicked: e.preventDefault() | onActionClicked returns true | override onActionClicked and return true |
| Tap opens the viewer | Built in; the onPresented hook fires | opensViewer = false, then onGroupClickListener | opensViewer = false, then onGroupClick |
| External user ID and tags | setExternalUserId(), setTags(), or init() | TaleartConfig.externalUserId (sent in a header) and tags (applied on the device) | TaleartConfig(externalUserId:, tags:): the same as Android |
| Fallback when the zone fails | fallback="message" or init({ fallback }); a slot="fallback" child | TaleartConfig.fallback; TaleartView.fallbackView; TaleartZone(fallback =) | TaleartConfig(fallback:); zone.fallbackViewController and fallbackHeight |
| Viewer properties | init({ properties }), setProperties(), setProperty(name, value) | TaleartConfig.properties; TaleartView.properties (per view; no XML attribute) | TaleartConfig(properties:); zone.properties (per zone) |
| Frequency cap | frequency attribute or init({ frequency }) | TaleartConfig.frequency | TaleartConfig(frequency:) |
| Analytics events | analytics="off" or init({ analytics: false }) | TaleartConfig.analytics; app:taleartAnalytics; TaleartZone(analytics =) | TaleartConfig(analytics:); zone.analytics |
Not available natively yet
- onGroupImpression counts a group when it is first shown in a render, not when it is on screen: the native SDK does not measure visibility yet.
- The Compose TaleartZone has no properties parameter: a composable uses the SDK’s viewer properties from TaleartConfig, and cannot set its own for one zone.