package cn.qiuxiang.react.baidumap.modules import android.util.Log import cn.qiuxiang.react.baidumap.toLatLng import cn.qiuxiang.react.baidumap.toWritableMap import com.baidu.mapapi.search.core.SearchResult import com.baidu.mapapi.search.geocode.* import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener import com.baidu.mapapi.search.sug.SuggestionResult import com.baidu.mapapi.search.sug.SuggestionSearch import com.baidu.mapapi.search.sug.SuggestionSearchOption import com.facebook.react.bridge.* import com.google.gson.Gson @Suppress("unused") class BaiduMapGeocodeModule(context: ReactApplicationContext) : ReactContextBaseJavaModule(context) { private var promise: Promise? = null private val geoCoder by lazy { val geoCoder = GeoCoder.newInstance() geoCoder.setOnGetGeoCodeResultListener(object : OnGetGeoCoderResultListener { override fun onGetGeoCodeResult(result: GeoCodeResult?) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { // TODO: provide error message promise?.reject("", "") } else { val data = Arguments.createMap() data.putString("address", result.address) data.putDouble("latitude", result.location.latitude) data.putDouble("longitude", result.location.longitude) promise?.resolve(data) } promise = null } override fun onGetReverseGeoCodeResult(result: ReverseGeoCodeResult?) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { // TODO: provide error message promise?.reject("", "") } else { val data = result.location.toWritableMap() data.putString("country", result.addressDetail.countryName) data.putString("poiList", Gson().toJson(result.poiList)) data.putString("countryCode", result.addressDetail.countryCode.toString()) data.putString("province", result.addressDetail.province) data.putString("city", result.addressDetail.city) data.putString("cityCode", result.cityCode.toString()) data.putString("district", result.addressDetail.district) data.putString("street", result.addressDetail.street) data.putString("streetNumber", result.addressDetail.streetNumber) data.putString("adCode", result.addressDetail.adcode.toString()) data.putString("businessCircle", result.businessCircle) data.putString("address", result.address) data.putString("description", result.sematicDescription) promise?.resolve(data) } promise = null } }) geoCoder } private val suggestSearch by lazy { val suggestSearch = SuggestionSearch.newInstance() suggestSearch.setOnGetSuggestionResultListener(object : OnGetSuggestionResultListener { override fun onGetSuggestionResult(result: SuggestionResult?) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { promise?.reject("", "") } else { val data = Arguments.createMap() data.putString("suggestion", Gson().toJson(result.allSuggestions)) promise?.resolve(data) } promise = null } }) suggestSearch } override fun getName(): String { return "BaiduMapGeocode" } override fun canOverrideExistingModule(): Boolean { return true } @ReactMethod fun search(address: String, city: String, promise: Promise) { if (this.promise == null) { this.promise = promise geoCoder.geocode(GeoCodeOption().address(address).city(city)) } else { promise.reject("", "This callback type only permits a single invocation from native code") } } @ReactMethod fun reverse(coordinate: ReadableMap, promise: Promise) { if (this.promise == null) { this.promise = promise geoCoder.reverseGeoCode(ReverseGeoCodeOption().location(coordinate.toLatLng())) } else { promise.reject("", "This callback type only permits a single invocation from native code") } } @ReactMethod fun suggestion(address: String, city: String, promise: Promise) { if (this.promise == null) { this.promise = promise suggestSearch.requestSuggestion(SuggestionSearchOption().keyword(address).city(city)) } else { promise.reject("", "This callback type only permits a single invocation from native code") } } }