Android project requirements
System requirements:- minSdk = 26 (Android 8.0)
- compileSdk = 35
- Android Gradle Plugin 8.11.0
- Gradle 8.14.2
- Kotlin 2.2.0
Installing the library
- Add the maven repository in your project’s
settings.gradle.ktsfile:
- Add the library as a dependency in your
app/build.gradle.ktsfile:
Replace
To find the right version, navigate to:
<version> with the correct version corresponding to your platform version.To find the right version, navigate to:
Release Notes → Choose your platform version → Deployment guidelines → Component versions
Library dependencies
Impactful dependencies:- Android Core KTX 1.16.0
- Android Activity Compose 1.10.1
- Compose BOM 2025.09.01
- Accompanist Permissions 0.37.3
- Kotlin Coroutines 1.10.2
- Compose Navigation 2.9.1
- Android Lifecycle 2.9.1
- Android Core Library Desugaring 2.1.5
- OkHttp BOM 4.12.0
- Retrofit 2.12.0
- Moshi 1.15.2
- Coil BOM 3.2.0
Public API
The SDK library is managed through theFlowx singleton instance, which exposes the following methods:
Configuring the library
To configure the SDK, there are two things needed in the project’s application class:- first, make it implement the
FlowxOwnerinterface:
- then, call the
initmethod inside theonCreate()method:
Parameters
• The
custom components implementation is explained in its own section.• The implementation for providing a
custom view for the header of the Stepper component is detailed in its own section.• The implementation for providing a
custom loader is explained in its own section.• Collecting analytics events from the SDK is explained in its own section.
• Handling the start of a new process while in a running process is explained in its own section.
Sample
Config data for the config parameter above are:
Custom validators
Thecustom validators map is a collection of lambda functions, referenced by name (i.e. the value of the key in this map), each returning a Boolean based on the String which needs to be validated.
For a custom validator to be evaluated for a form field, its name must be specified in the form field process definition.
Using the library
Authentication
To be able to use the SDK, authentication is required. Therefore, before calling any other method on the singleton instance, make sure that the access token is set by calling:Theming
To be able to use styled components while rendering a process, the theming mechanism must be invoked by calling thesuspend-ing setupTheme(...) method over the singleton instance of the SDK:
Parameters
If the
If the
themeUuid parameter value is empty (""), no theme will be fetched, and the mechanism will rely only on the fallback file, if set.If the
fallbackThemeJsonFileAssetsPath parameter value is null, there will be no fallback mechanism set in place, meaning if fetching the theme fails, the redered process will have no style applied over it’s displayed components.The SDK caches the fetched themes, so if a theme fetch fails, a cached version will be used, if available. Otherwise, it will use the file given as fallback.
Sample
Changing current locale settings
The currentlocale and language can be also changed after the initial setup, by calling the changeLocaleSettings function:
Parameters
Sample
The
More information regarding the standard can be found by reading RFC 4647 “Matching of Language Tags” and RFC 5646 “Tags for Identifying Languages”.
An example of BCP 47 is
Locale satisfies the IETF BCP 47 standard for representing language and country/region codes.More information regarding the standard can be found by reading RFC 4647 “Matching of Language Tags” and RFC 5646 “Tags for Identifying Languages”.
An example of BCP 47 is
en-US (language code en and country US).Start a FlowX process
After performing all the above steps and all the prerequisites are fulfilled, a new instance of a FlowX process can be started, by using thestartProcess function:
Parameters
Sample
Resume a FlowX process
To resume an existing instance of a FlowX process, after fulfilling all the prerequisites, use thecontinueProcess function:
Parameters
Sample
closeModalFunc parameter
The closeModalFunc parameter is a function defined within the CloseModalProcessScope context.
This gives the ability to query for substitution tags or media library items to use them when handling this callback (i.e. showing an snackbar or an alert).
Get a substitution tag value by key
CustomComponentScope context, using the method above, by providing the key.
It returns:
- the key’s counterpart, if the
keyis valid and found - the empty string, if the
keyis valid, but not found - the unaltered string, if the key has the wrong format (i.e. not starting with
@@)
Get a media item url by key
CustomComponentScope context, using the method above, by providing the key.
It returns the URL string of the media resource, or null, if not found.
Sample
Start an UI Flow
After performing all the above steps and all the prerequisites are fulfilled, an UI Flow can be started, by using thestartUiFlow function:
Parameters
Sample
Custom components
The container application should decide which custom component view to provide using thecomponentIdentifier configured in the UI designer.
A custom component receives data to populate the view and actions available to execute, as described below.It can also be validated and provide data back into the process when executing an action. To handle custom components, an implementation of the
CustomComponentsProvider interface should be passed as a parameter when initializing the SDK:
Sample
CustomComponent
The implementation for providing a custom component is based on creating and binding a user defined @Composable function, through theCustomComponent interface:
CustomComponentScope
Thecomposable property of the CustomComponent is a @Composable function which may be defined and run only within the context of a CustomComponentScope receiver.
Execute action
The custom components which the container app provides may contain FlowX actions available for execution.These actions are received through the
actions parameter of the populateUi(actions: Map<String, CustomComponentAction>) method.To run an action (e.g., on a click of a button in the custom component) you need to call the
executeAction method, through the CustomComponentScope context:
Parameters
Execute upload action
A specific use case for executing actions from custom components involves uploading files into the FlowX platform.To run an upload action (e.g., on a click of a button in the custom component) you need to call the
executeUploadAction method, through the CustomComponentScope context:
Parameters
Sample
In order for the upload behave correctly, it’s highly IMPORTANT to disable the SDK internal update mechanism while selecting a file.
Get a substitution tag value by key
CustomComponentScope context, using the method above, by providing the key.
It returns:
- the key’s counterpart, if the
keyis valid and found - the empty string, if the
keyis valid, but not found - the unaltered string, if the key has the wrong format (i.e. not starting with
@@)
Get a media item url by key
CustomComponentScope context, using the method above, by providing the key.
It returns the URL string of the media resource, or null, if not found.
Obtain enumeration data
CustomComponentScope context, using the method above, by providing the name (and the parentName, if there’s a hierarchy defined and the desired enumeration data (name is child of parentName).
It returns the enumeration data, as an FxEnumeration object, or null, if not found.
Sample
Among multiple existing custom components, there may be one that:- allows the input of a value representing an
age - the value should be validated (e.g. to be at least 35 years old)
- the value will be passed back into the process
- execute an action, through the
CustomComponentScopecontext, to skip setting the age
Custom header view for the STEPPER component
The container app can opt for providing a custom view to use for all the Stepper components, as a replacement for the built-in header.The custom view receives
data to populate its UI, as described below.
To provide a custom header for the Stepper, an implementation of the CustomStepperHeaderProvider interface should be passed as a parameter when initializing the SDK:
Sample
CustomStepperHeader
To provide the custom header view as a @Composable function, you have to implement theCustomStepperHeader interface:
Sample
Custom loaders
The container application can decide to provide custom loaders to be displayed at certain moments based on a given predefinedactionName.To provide custom loaders, an implementation of the
CustomLoaderProvider interface should be passed as a parameter when initializing the SDK:
CustomLoaderProvider.LoaderType is defined like this:
The available types for the
loaderType parameter are:LoaderType.StartProcess- received for overriding the loader displayed when starting a new processLoaderType.ReloadProcess- received for overriding the loader displayed when resuming an existing processLoaderType.Action- received for overriding the loader displayed while the action having thenamename is executedLoaderType.Upload- received for overriding the loader displayed while the upload action having thenamename is executed
name property received for the LoaderType.Action and LoaderType.Upload types represents the name of an action, as defined at process definition time, received for being able to override the loader displayed while that action is executed.Returning an implementation of a
Returning
CustomLoader replaces the built-in platform loader with the provided one for the specified use cases.Returning
null keeps the built-in platform loader for the specified use cases.CustomLoader
The implementation for providing a custom loader is based on creating and binding a user defined @Composable function, through theCustomLoader interface:
CustomLoaderScope
Thecomposable property of the CustomLoader is a @Composable function which may be defined and run only within the context of a CustomLoaderScope receiver.
Sample
Collecting analytics events
To be able to collect analytics events from the SDK, an implementation for theAnalyticsCollector functional interface may be provided when initializing the SDK:
Screen and Action, both of them containing some Data and an optional CustomPayload, as defined at process definition time.
The Event is structured like this:
Sample
The implementation can be passed as a lambda, like:The
value property represents the identifier set in the process definition.For action type events there are some additional properties provided:component- The type of component triggering the actionlabel- The label of the component, if available. (E.g. title of a button or label of a form element)screen- The identifier of the screen containing the component, if set
customPayload is defined at process definition time, and then processed inside the platform before sending it to being collected.Handling “Start of a new process”
When an action of typeSTART_PROJECT is executed, the onNewProcessStarted lambda provided in the Flowx.getInstance().init(...) function is invoked.
This callback provides the UUID of the newly started process, which can be used to resume the process by calling the Flowx.getInstance().continueProcess(...) method.
It is the responsibility of the container application’s developer to implement the necessary logic for displaying the appropriate UI for the newly started process.
Sample
One way to handle this is to send a broadcast message to notify the Activity currently displaying the running process. The Activity should handle the broadcast to reload and display the newly started process identified byprocessInstanceUuid (received in the broadcast intent).
ProGuard / R8
The SDK ships with its ownconsumer-rules.pro file containing the required keep rules for correct functionality.These rules are automatically merged into the container app’s ProGuard/R8 configuration and applied during code shrinking and obfuscation.
The container app may add additional rules if its specific logic requires them.
Known issues
- shadows are rendered only on Android >= 28 having hardware acceleration enabled

