Android native module integration

Create module

In your Android Studio project create a new Java or Kotlin class named AppfiguateModule

Example Kotlin AppfigurateModule example

package com.your.package.name.here

import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.modules.core.DeviceEventManagerModule
import nz.co.electricbolt.appfiguratelibrary.Appfigurate
import nz.co.electricbolt.appfiguratelibrary.Configuration

class AppfigurateModule internal constructor(context: ReactApplicationContext?) :
    ReactContextBaseJavaModule(context) {
    private var cachedConfiguration: Map<String, Any> =
        Configuration.sharedConfiguration()._dictionaryFromConfiguration()

    private var listenerCount = 0

    init {
        Appfigurate.addConfigurationUpdatedListener { action: String? ->
            cachedConfiguration = Configuration.sharedConfiguration()._dictionaryFromConfiguration()
            if (listenerCount > 0) {
                val params = Arguments.createMap()
                params.putString("APLConfigurationUpdatedAction", action)
                reactApplicationContext.getJSModule(
                    DeviceEventManagerModule.RCTDeviceEventEmitter::class.java
                ).emit("APLConfigurationUpdated", params)
            }
        }
    }

    override fun getName(): String {
        return "AppfigurateModule"
    }

    @ReactMethod
    fun nativeValue(propertyName: String, result: Promise) {
        result.resolve(cachedConfiguration[propertyName])
    }

    @ReactMethod
    fun description(result: Promise) {
        result.resolve(Configuration.sharedConfiguration().description())
    }

    @ReactMethod
    fun modifications(result: Promise) {
        result.resolve(Configuration.sharedConfiguration().modifications())
    }

    @ReactMethod
    fun version(result: Promise) {
        result.resolve(Appfigurate.version())
    }

    @ReactMethod
    fun setLogging(logging: Boolean, result: Promise) {
        Appfigurate.setLogging(logging)
        result.resolve(null)
    }

    @ReactMethod
    fun saveConfiguration(result: Promise) {
        Appfigurate.saveConfiguration()
        result.resolve(null)
    }

    @ReactMethod
    fun restoreConfiguration(result: Promise) {
        Appfigurate.restoreConfiguration()
        result.resolve(null)
    }

    @ReactMethod
    fun addListener(eventName: String?) {
        listenerCount += 1
    }

    @ReactMethod
    fun removeListeners(count: Int) {
        listenerCount -= count
    }
}

Create package

In your Android Studio project create a new Java or Kotlin class named AppfiguatePackage

Example Kotlin AppfiguratePackage example

package com.your.package.name.here

import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager

class AppfiguratePackage : ReactPackage {
    override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
        return emptyList()
    }

    override fun createNativeModules(
        reactContext: ReactApplicationContext
    ): List<NativeModule> {
        val modules: MutableList<NativeModule> = ArrayList()
        modules.add(AppfigurateModule(reactContext))
        return modules
    }
}

Register package

Locate ReactNativeHost’s getPackages() method and add AppfiguratePackage to the packages list getPackages() returns:

Kotlin ReactNativeHost example

override fun getPackages(): List<ReactPackage> =
    PackageList(this).packages.apply {
        // Packages that cannot be autolinked yet can be added manually here, for example:
        // add(MyReactNativePackage())
        add(AppfiguratePackage())
    }

The Android native module is now integrated. Now jump to JavaScript integration.

Last updated