website logo
Legacy DocsPortal
⌘K
Welcome to Ditto
Onboarding
Ditto Basics
SDK Setup Guides
Platform Manual
HTTP API
Kafka Connector
Use Cases
FAQs
Troubleshooting Guide
Support
Docs powered by
Archbee
SDK Setup Guides
Kotlin

Installing Kotlin SDK

13min

You can integrate the Ditto SDK into Kotlin projects to develop native apps for the Android platform.

For a complete overview of the platforms, transports, and devices the Kotlin SDK supports, see Compatibility with Kotlin.

To install the Kotlin SDK and start syncing offline:

1

Confirm that you meet the minimum requirements. (Prerequisites)

2

Prepare your environment for Ditto. (Setting Up Your Environment)

3

Configure your app permissions. (Setting Up Permissions)

4

Authenticate with the Big Peer and then start syncing offline. (Integrating and Initializing)

Prerequisites

Following are the minimum requirements that must be met before attempting to install Ditto.

  • Android version 6.0 (Marshmallow)
  • minSdk version 23.0
  • compileSdk version 31.0
  • Java Development Kit (JDK) version 11.0

Setting Up Your Environment

1

Confirm that mavenCentral() is in the project-level build.gradle:

Bash
|
allprojects {
    repositories {
        mavenCentral()
    }
}

2

In the individual module build.gradle file:

Bash
|
dependencies {
  // ...
  implementation "{{android_install_code_version}}
"
}



Setting Up Permissions

The Android operating system restricts access to some device functionality for the sake of user control and privacy. Therefore, to unlock the full capabilities of Ditto, it is essential to configure your app so that it requests all the permissions that it needs. Then at runtime your app must prompt the user to request certain permissions.



Android Manifest Permissions

The Ditto Android SDK includes a set of permissions that are required to use all the device features necessary to enable sync. The permissions below will be automatically merged into your app's final manifest.

AndroidManifest.xml
|
<manifest
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.BLUETOOTH"
    android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
    android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"
    tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"
    tools:targetApi="s" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation"
    tools:targetApi="s" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
    android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
    android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
    android:usesPermissionFlags="neverForLocation"
    tools:targetApi="tiramisu" />


The tools:targetApi attribute causes the permission to only be requested on devices running the specified API level or higher. This avoids errors on older OS versions that do not recognize the permission.

The android:maxSdkVersion attribute causes that permission to only be requested on devices running the specified SDK level or lower. This avoids asking for more permissions than Ditto needs, however it will prevent your app from being able to request the permission on devices running a newer OS version. To opt out of this behavior and request the permission on all OS versions, see the following snippet:

Location Permission Override
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
    tools:remove="android:maxSdkVersion" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
    tools:remove="android:maxSdkVersion" />


Note that you may need to add the xmlns:tools="http://schemas.android.com/tools" namespace attribute to your app's root <manifest> tag as shown in the AndroidManifest.xml example above.

This will configure your app's build to ignore the android:maxSdkVersion attribute in our SDK allowing the permission to be requested on any SDK version. This techniquie can be used to tweak any permissions to your liking.

For more details, see the documentation for the Bluetooth and WiFi Aware permissions in the Android Documentation.

Runtime Permissions

Bluetooth LE and WiFi Aware require the user to allow permissions at runtime. Your apps must ensure all required permissions for sync have been requested from the user. The Android Ditto SDK provides a DittoSyncPermissions helper which makes this easy. Call the following in your Activity or Fragment's onCreate method:


Kotlin
|
fun checkPermissions() {
    val missing = DittoSyncPermissions(this).missingPermissions()
    if (missing.isNotEmpty()) {
        this.requestPermissions(missing, 0)
    }
}


On Android there may be a noticeable delay between when the user grants location access and when Ditto notices the new permission. For this reason it is recommended to call refreshPermissions() whenever a relevant permission might have changed. This will force an immediate check. If a permission has become available your app can begin syncing as quickly as possible.


Kotlin
|
fun checkPermissions() {
    val activity = requireActivity()
    val missing = DittoSyncPermissions(activity).missingPermissions()
    if (missing.isNotEmpty()) {
        activity.requestPermissions(missing, 0)
    }
}


For more information about requesting permissions in a user-friendly way refer to Android's documentation: Request App Permissions.



Integrating and Initializing

1

Add Ditto to your application.

We recommend placing this in your Application.onCreate method. Note that the Context you want to reference here is the Application level Context, rather than whatever Activity you might happen to be instantiating the Ditto instance from initially. This is because you need to ensure that your app is keeping a single Ditto instance alive for the entire lifetime of the application so it's not going out of scope or getting garbage collected.

Kotlin
|
try {
    val androidDependencies = DefaultAndroidDittoDependencies(context)
    val identity = DittoIdentity.OnlinePlayground(
        androidDependencies,
        appId = "REPLACE_ME_WITH_YOUR_APP_ID",
        token = "REPLACE_ME_WITH_YOUR_PLAYGROUND_TOKEN"
    )
    DittoLogger.minimumLogLevel = DittoLogLevel.DEBUG
    ditto = Ditto(androidDependencies, identity)
    ditto.startSync()
} catch (e: DittoError) {
    Log.e("Ditto error", e.message!!)
}

2

Replace YOUR_APP_ID and YOUR_PLAYGROUND_TOKEN with your access credentials available from the portal.

For instructions on how to obtain your access credentials, see Onboarding. For an introduction to authentication in Ditto, see Ditto Basics > Authentication and Initialization.



Updated 27 Sep 2023
Did this page help you?
PREVIOUS
Swift 1.x.x
NEXT
Task App Tutorials for Kotlin
Docs powered by
Archbee
TABLE OF CONTENTS
Prerequisites
Setting Up Your Environment
Setting Up Permissions
Android Manifest Permissions
Runtime Permissions
Integrating and Initializing
Docs powered by
Archbee