LimeLink Android SDK 1.0.0

Min SDK 24 · Compile SDK reference 33 · Java bytecode 8

LimeLink Android SDK handles direct links, App Links, deferred deep links, and explicit view tracking through Kotlin and Java facades. Version 1.0.0 is publicly resolvable from the LimeLink Maven repository; immutable GitHub tag and release provenance remains pending.

View previous Android SDK releases

Install

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://hellovelop.github.io/limelink-aos-sdk-binary/repository")
            content { includeGroup("org.limelink") }
        }
    }
}
dependencies {
    implementation("org.limelink:limelink-aos-sdk:1.0.0")
}

The public Maven repository supports credential-free Gradle resolution. JitPack, source dependencies, composite builds, Maven Local, debug AARs, and direct release-AAR installation are not production routes.

Initialize

class MyApp : Application() {
    private val listener = object : LimeLinkListener {
        override fun onDeeplinkReceived(result: LimeLinkResult) {
            if (isAllowedDestination(result.deeplinkUrl)) {
                navigateTo(result.deeplinkUrl)
            }
        }

        override fun onDeferredDeepLinkNotFound() = Unit

        override fun onDeeplinkError(error: LimeLinkError) {
            showSafeFallback(error.code, error.message)
        }
    }

    override fun onCreate() {
        super.onCreate()
        LimeLinkSDK.addLinkListener(listener)

        val config = LimeLinkConfig.Builder(
            "550e8400-e29b-41d4-a716-446655440000"
        ).setLogging(false).build()
        LimeLinkSDK.init(this, config)
    }
}

Use the public Project UUID in app configuration; Organization API credentials remain server-side credentials. Automatic deferred lookup starts for every eligible installation.

Manifest and lifecycle

Configure the Activity for the exact LimeLink or Custom Domain owned by the app. A typical App Link filter uses https, the registered host, and /link/ where applicable. Keep launchMode="singleTop" and update the current Intent:

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
}

Normal Activity lifecycle handling owns cold and warm App Links. Only when the host explicitly owns a handoff, call:

LimeLinkSDK.handleIncomingLink(this, intent)

The API accepts actual ACTION_VIEW Intents. Direct links are absolute hierarchical non-web URLs resolved to the host app; HTTP(S) links use Dynamic Lookup. Unsafe, malformed, relative, whitespace, and control-character URLs are rejected. Direct links stay local to the app without resolve or Stats networking.

Receive results

The strongly retained listener registered before init receives Direct, App Link, and Deferred successes through onDeeplinkReceived.

FieldContract
deeplinkUrlRequired final URL and sole routing authority
sourcedirectDeepLink, universalLink, or deferredDeepLink
originalUrlnull for direct, inbound HTTPS URL for App Links, backend original URL for Deferred
isDeferredDerived from Deferred source

All public callbacks run on the Android main thread. Parse deeplinkUrl and exactly compare its scheme and host against an app-owned allowlist before navigation.

Buffering, ordering, and deduplication

Manual deferred handling

LimeLinkSDK.handleDeferredDeepLink(this) { result, error ->
    when {
        result != null && isAllowedDestination(result.deeplinkUrl) ->
            navigateTo(result.deeplinkUrl)
        error != null -> showSafeFallback(error.code, error.message)
        else -> Unit
    }
}

Matched, not-found, and failed outcomes reach both the completion and current listener. Their relative order is unspecified; choose one navigation owner.

Java facade

The Java facade exposes exactly:

LimeLinkJavaSDK.initialize(context, config, listener);
LimeLinkJavaSDK.handleIncomingLink(activity, intent);
LimeLinkJavaSDK.handleDeferredDeepLink(context, callback);
boolean initialized = LimeLinkJavaSDK.isInitialized();

Java initialization must run on the main thread. The Deferred callback provides onMatched, onNotFound, and onFailed.

Explicit stats

Use LimeLinkSDK.trackLinkStatus(context, intent) only for a separate app-owned view event. It is best effort; successful Dynamic Lookup already owns lookup attribution.

Migrating from 0.4.1