AMapOfflineModule.kt 3.3 KB
package cn.qiuxiang.react.amap3d

import com.amap.api.maps.offlinemap.OfflineMapCity
import com.amap.api.maps.offlinemap.OfflineMapManager
import com.amap.api.maps.offlinemap.OfflineMapProvince
import com.amap.api.maps.offlinemap.OfflineMapStatus
import com.facebook.react.bridge.*
import com.facebook.react.modules.core.DeviceEventManagerModule

@Suppress("unused")
class AMapOfflineModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), OfflineMapManager.OfflineMapDownloadListener {
    private val manager = OfflineMapManager(reactContext, this)

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

    @ReactMethod
    fun getProvinces(promise: Promise) {
        val provinces = Arguments.createArray()
        manager.offlineMapProvinceList.forEach { provinces.pushMap(buildProvince(it)) }
        promise.resolve(provinces)
    }

    @ReactMethod
    fun getCities(promise: Promise) {
        val cities = Arguments.createArray()
        manager.offlineMapCityList.forEach { cities.pushMap(buildCity(it)) }
        promise.resolve(cities)
    }

    @ReactMethod
    fun download(name: String) {
        manager.offlineMapProvinceList.forEach {
            if (it.provinceName == name) {
                return manager.downloadByProvinceName(name)
            }
            it.cityList.forEach {
                if (it.city == name) {
                    return manager.downloadByCityName(name)
                }
            }
        }
    }

    @ReactMethod
    fun stop() {
        manager.stop()
    }

    @ReactMethod
    fun remove(name: String) {
        manager.remove(name)
    }

    private fun buildCity(city: OfflineMapCity): WritableMap {
        val map = Arguments.createMap()
        map.putString("name", city.city)
        map.putString("code", city.code)
        map.putString("state", getState(city.state))
        map.putInt("size", city.size.toInt())
        return map
    }

    private fun buildProvince(province: OfflineMapProvince): WritableMap {
        val map = Arguments.createMap()
        map.putString("name", province.provinceName)
        map.putString("state", getState(province.state))
        map.putInt("size", province.size.toInt())

        val cities = Arguments.createArray()
        province.cityList.forEach { cities.pushMap(buildCity(it)) }
        map.putArray("cities", cities)

        return map
    }

    private fun getState(code: Int): String {
        var state = ""
        when (code) {
            OfflineMapStatus.SUCCESS -> state = "downloaded"
            OfflineMapStatus.LOADING -> state = "downloading"
            OfflineMapStatus.NEW_VERSION -> state = "expired"
            OfflineMapStatus.WAITING -> state = "waiting"
            OfflineMapStatus.UNZIP -> state = "unzip"
        }
        return state
    }

    override fun onDownload(state: Int, progress: Int, name: String?) {
        val data = Arguments.createMap()
        data.putString("name", name)
        data.putString("state", getState(state))
        data.putInt("progress", progress)
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java).emit("download", data)
    }

    override fun onCheckUpdate(p0: Boolean, p1: String?) {}

    override fun onRemove(p0: Boolean, p1: String?, p2: String?) {}
}