diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt new file mode 100644 index 0000000..bbf2921 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt @@ -0,0 +1,38 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationKit { + private const val kTag = "LocationKit" + + fun getCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) + locationOption.isOnceLocation = true //仅定位一次 + //给定位客户端对象设置定位参数 + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt new file mode 100644 index 0000000..bbf2921 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt @@ -0,0 +1,38 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationKit { + private const val kTag = "LocationKit" + + fun getCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) + locationOption.isOnceLocation = true //仅定位一次 + //给定位客户端对象设置定位参数 + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 334c223..c3b502c 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -1,21 +1,89 @@ package com.casic.br.operationsite.view import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import android.view.View +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.casic.br.operationsite.R +import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar +import com.casic.br.operationsite.model.UserDetailModel +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationKit +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.getScreenWidth +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch +import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { + private val kTag = "InstallEquipmentActivity" + private val context = this + private val marginOffset by lazy { 2.dp2px(this) } + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var imageAdapter: EditableImageAdapter + override fun initViewBinding(): ActivityInstallEquipmentBinding { return ActivityInstallEquipmentBinding.inflate(layoutInflater) } override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + override fun onRightClick() { + + } + }) } override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + val userDetail = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + + binding.operatorView.setText(userDetail.name) + } + + //左右边距 + val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter } override fun observeRequestState() { @@ -23,6 +91,133 @@ } override fun initEvent() { + binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.locationImageView.setOnClickListener { + LocationKit.getCurrentLocation(context, object : LocationKit.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号差,定位失败,请移动位置再试".show(context) + } else { + binding.longitudeView.setText(aMapLocation.longitude.toString()) + binding.latitudeView.setText(aMapLocation.latitude.toString()) + } + } + }) + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (recyclerViewImages[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + navigatePageTo(position, recyclerViewImages) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() + } + }) + } + + private val textWatcher = object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + s?.apply { + if (s.startsWith("3A") || s.startsWith("34")) { + binding.deviceModelView.text = "BIRMM-GT400N" + binding.deviceNameView.setText("便携式燃气智能监测设备") + } else { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + + if (s.isNullOrBlank()) { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + } + + private fun selectPicture() { + BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) + .setItemTextColor(R.color.mainThemeColor.convertColor(this)) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照保存失败,请重试".show(context) + return + } + analyticalSelectResults(result.first()) + } + + override fun onCancel() { + + } + }) + } + + 1 -> { + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + analyticalSelectResults(it) + } + } + } + + override fun onCancel() { + + } + }) + } + } + } + }).build().show() + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: ${file.absolutePath}") + //上传图片 +// uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt new file mode 100644 index 0000000..bbf2921 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt @@ -0,0 +1,38 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationKit { + private const val kTag = "LocationKit" + + fun getCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) + locationOption.isOnceLocation = true //仅定位一次 + //给定位客户端对象设置定位参数 + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 334c223..c3b502c 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -1,21 +1,89 @@ package com.casic.br.operationsite.view import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import android.view.View +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.casic.br.operationsite.R +import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar +import com.casic.br.operationsite.model.UserDetailModel +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationKit +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.getScreenWidth +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch +import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { + private val kTag = "InstallEquipmentActivity" + private val context = this + private val marginOffset by lazy { 2.dp2px(this) } + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var imageAdapter: EditableImageAdapter + override fun initViewBinding(): ActivityInstallEquipmentBinding { return ActivityInstallEquipmentBinding.inflate(layoutInflater) } override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + override fun onRightClick() { + + } + }) } override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + val userDetail = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + + binding.operatorView.setText(userDetail.name) + } + + //左右边距 + val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter } override fun observeRequestState() { @@ -23,6 +91,133 @@ } override fun initEvent() { + binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.locationImageView.setOnClickListener { + LocationKit.getCurrentLocation(context, object : LocationKit.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号差,定位失败,请移动位置再试".show(context) + } else { + binding.longitudeView.setText(aMapLocation.longitude.toString()) + binding.latitudeView.setText(aMapLocation.latitude.toString()) + } + } + }) + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (recyclerViewImages[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + navigatePageTo(position, recyclerViewImages) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() + } + }) + } + + private val textWatcher = object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + s?.apply { + if (s.startsWith("3A") || s.startsWith("34")) { + binding.deviceModelView.text = "BIRMM-GT400N" + binding.deviceNameView.setText("便携式燃气智能监测设备") + } else { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + + if (s.isNullOrBlank()) { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + } + + private fun selectPicture() { + BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) + .setItemTextColor(R.color.mainThemeColor.convertColor(this)) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照保存失败,请重试".show(context) + return + } + analyticalSelectResults(result.first()) + } + + override fun onCancel() { + + } + }) + } + + 1 -> { + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + analyticalSelectResults(it) + } + } + } + + override fun onCancel() { + + } + }) + } + } + } + }).build().show() + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: ${file.absolutePath}") + //上传图片 +// uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 2ebff9f..274637f 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -17,7 +17,7 @@ import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.LocationHelper +import com.casic.br.operationsite.utils.LocationKit import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -88,7 +88,21 @@ } uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() + } + } + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] + eventViewModel.resultModel.observe(this) { + if (it.code == 200) { + finish() + } + } //左右边距 val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) @@ -143,15 +157,6 @@ } }) - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val url = it.data.toString() - imagePaths.add(url) - recyclerViewImages.add(url.combineImagePath()) - imageAdapter.notifyDataSetChanged() - } - } - binding.siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -202,12 +207,6 @@ mapLocation?.latitude.toString(), ) } - - eventViewModel.resultModel.observe(this) { - if (it.code == 200) { - finish() - } - } } private fun selectPicture() { @@ -264,7 +263,7 @@ private fun getCurrentLocation() { binding.eventLocationView.text = "定位中..." - LocationHelper.getCurrentLocation(this, object : LocationHelper.ILocationListener { + LocationKit.getCurrentLocation(this, object : LocationKit.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { if (aMapLocation == null) { binding.eventLocationView.text = "定位失败" diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt new file mode 100644 index 0000000..bbf2921 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt @@ -0,0 +1,38 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationKit { + private const val kTag = "LocationKit" + + fun getCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) + locationOption.isOnceLocation = true //仅定位一次 + //给定位客户端对象设置定位参数 + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 334c223..c3b502c 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -1,21 +1,89 @@ package com.casic.br.operationsite.view import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import android.view.View +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.casic.br.operationsite.R +import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar +import com.casic.br.operationsite.model.UserDetailModel +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationKit +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.getScreenWidth +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch +import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { + private val kTag = "InstallEquipmentActivity" + private val context = this + private val marginOffset by lazy { 2.dp2px(this) } + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var imageAdapter: EditableImageAdapter + override fun initViewBinding(): ActivityInstallEquipmentBinding { return ActivityInstallEquipmentBinding.inflate(layoutInflater) } override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + override fun onRightClick() { + + } + }) } override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + val userDetail = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + + binding.operatorView.setText(userDetail.name) + } + + //左右边距 + val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter } override fun observeRequestState() { @@ -23,6 +91,133 @@ } override fun initEvent() { + binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.locationImageView.setOnClickListener { + LocationKit.getCurrentLocation(context, object : LocationKit.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号差,定位失败,请移动位置再试".show(context) + } else { + binding.longitudeView.setText(aMapLocation.longitude.toString()) + binding.latitudeView.setText(aMapLocation.latitude.toString()) + } + } + }) + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (recyclerViewImages[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + navigatePageTo(position, recyclerViewImages) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() + } + }) + } + + private val textWatcher = object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + s?.apply { + if (s.startsWith("3A") || s.startsWith("34")) { + binding.deviceModelView.text = "BIRMM-GT400N" + binding.deviceNameView.setText("便携式燃气智能监测设备") + } else { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + + if (s.isNullOrBlank()) { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + } + + private fun selectPicture() { + BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) + .setItemTextColor(R.color.mainThemeColor.convertColor(this)) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照保存失败,请重试".show(context) + return + } + analyticalSelectResults(result.first()) + } + + override fun onCancel() { + + } + }) + } + + 1 -> { + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + analyticalSelectResults(it) + } + } + } + + override fun onCancel() { + + } + }) + } + } + } + }).build().show() + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: ${file.absolutePath}") + //上传图片 +// uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 2ebff9f..274637f 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -17,7 +17,7 @@ import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.LocationHelper +import com.casic.br.operationsite.utils.LocationKit import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -88,7 +88,21 @@ } uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() + } + } + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] + eventViewModel.resultModel.observe(this) { + if (it.code == 200) { + finish() + } + } //左右边距 val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) @@ -143,15 +157,6 @@ } }) - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val url = it.data.toString() - imagePaths.add(url) - recyclerViewImages.add(url.combineImagePath()) - imageAdapter.notifyDataSetChanged() - } - } - binding.siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -202,12 +207,6 @@ mapLocation?.latitude.toString(), ) } - - eventViewModel.resultModel.observe(this) { - if (it.code == 200) { - finish() - } - } } private fun selectPicture() { @@ -264,7 +263,7 @@ private fun getCurrentLocation() { binding.eventLocationView.text = "定位中..." - LocationHelper.getCurrentLocation(this, object : LocationHelper.ILocationListener { + LocationKit.getCurrentLocation(this, object : LocationKit.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { if (aMapLocation == null) { binding.eventLocationView.text = "定位失败" diff --git a/app/src/main/res/drawable/ic_location_install.xml b/app/src/main/res/drawable/ic_location_install.xml new file mode 100644 index 0000000..0db0eb9 --- /dev/null +++ b/app/src/main/res/drawable/ic_location_install.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt deleted file mode 100644 index ba7d3c3..0000000 --- a/app/src/main/java/com/casic/br/operationsite/utils/LocationHelper.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.casic.br.operationsite.utils - -import android.content.Context -import android.util.Log -import com.amap.api.location.AMapLocation -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption - -object LocationHelper { - private const val kTag = "LocationHelper" - - fun getCurrentLocation(context: Context, listener: ILocationListener) { - val locationClient = AMapLocationClient(context) - val locationOption = AMapLocationClientOption() - //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 - locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy - locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) - locationOption.isOnceLocation = true //仅定位一次 - //给定位客户端对象设置定位参数 - locationClient.setLocationOption(locationOption) - locationClient.setLocationListener { - if (it.errorCode == 0) { - listener.onAMapLocationGet(it) - } else { - listener.onAMapLocationGet(null) - //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 - Log.e( - kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" - ) - } - } - locationClient.startLocation() - } - - interface ILocationListener { - fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt new file mode 100644 index 0000000..bbf2921 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/LocationKit.kt @@ -0,0 +1,38 @@ +package com.casic.br.operationsite.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationKit { + private const val kTag = "LocationKit" + + fun getCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isNeedAddress = true //设置是否返回地址信息(默认返回地址信息) + locationOption.isOnceLocation = true //仅定位一次 + //给定位客户端对象设置定位参数 + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt index 334c223..c3b502c 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/InstallEquipmentActivity.kt @@ -1,21 +1,89 @@ package com.casic.br.operationsite.view import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import android.view.View +import androidx.lifecycle.lifecycleScope +import com.amap.api.location.AMapLocation +import com.casic.br.operationsite.R +import com.casic.br.operationsite.callback.OnImageCompressListener import com.casic.br.operationsite.databinding.ActivityInstallEquipmentBinding +import com.casic.br.operationsite.extensions.compressImage +import com.casic.br.operationsite.extensions.initImmersionBar +import com.casic.br.operationsite.model.UserDetailModel +import com.casic.br.operationsite.utils.GlideLoadEngine +import com.casic.br.operationsite.utils.LocaleConstant +import com.casic.br.operationsite.utils.LocationKit +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.dp2px +import com.pengxh.kt.lite.extensions.getScreenWidth +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ActivityStackManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.TitleBarView +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch +import java.io.File class InstallEquipmentActivity : KotlinBaseActivity() { + private val kTag = "InstallEquipmentActivity" + private val context = this + private val marginOffset by lazy { 2.dp2px(this) } + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val recyclerViewImages: ArrayList = ArrayList() //真实图片路径 + private lateinit var imageAdapter: EditableImageAdapter + override fun initViewBinding(): ActivityInstallEquipmentBinding { return ActivityInstallEquipmentBinding.inflate(layoutInflater) } override fun setupTopBarLayout() { + binding.rootView.initImmersionBar(this, false, R.color.mainThemeColor) + binding.titleView.setOnClickListener(object : TitleBarView.OnClickListener { + override fun onLeftClick() { + finish() + } + override fun onRightClick() { + + } + }) } override fun initOnCreate(savedInstanceState: Bundle?) { + ActivityStackManager.addActivity(this) + val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + val userDetail = Gson().fromJson( + userDetailJson, object : TypeToken() {}.type + ) + + binding.operatorView.setText(userDetail.name) + } + + //左右边距 + val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) + imageAdapter = EditableImageAdapter(this, recyclerViewImages, viewWidth, 3, 3) + binding.recyclerView.addItemDecoration( + RecyclerViewItemOffsets(marginOffset, marginOffset, marginOffset, marginOffset) + ) + binding.recyclerView.adapter = imageAdapter } override fun observeRequestState() { @@ -23,6 +91,133 @@ } override fun initEvent() { + binding.deviceCodeView.addTextChangedListener(textWatcher) + binding.locationImageView.setOnClickListener { + LocationKit.getCurrentLocation(context, object : LocationKit.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号差,定位失败,请移动位置再试".show(context) + } else { + binding.longitudeView.setText(aMapLocation.longitude.toString()) + binding.latitudeView.setText(aMapLocation.latitude.toString()) + } + } + }) + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (recyclerViewImages[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + navigatePageTo(position, recyclerViewImages) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + recyclerViewImages.removeAt(position) + imageAdapter.notifyDataSetChanged() + } + }) + } + + private val textWatcher = object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + s?.apply { + if (s.startsWith("3A") || s.startsWith("34")) { + binding.deviceModelView.text = "BIRMM-GT400N" + binding.deviceNameView.setText("便携式燃气智能监测设备") + } else { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + + if (s.isNullOrBlank()) { + binding.deviceModelView.text = "" + binding.deviceNameView.setText("") + } + } + } + + private fun selectPicture() { + BottomActionSheet.Builder().setContext(this).setActionItemTitle(listOf("拍照", "相册")) + .setItemTextColor(R.color.mainThemeColor.convertColor(this)) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照保存失败,请重试".show(context) + return + } + analyticalSelectResults(result.first()) + } + + override fun onCancel() { + + } + }) + } + + 1 -> { + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + lifecycleScope.launch { + flow { + result?.forEach { + emit(it) + delay(1000) + } + }.collect { + analyticalSelectResults(it) + } + } + } + + override fun onCancel() { + + } + }) + } + } + } + }).build().show() + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: ${file.absolutePath}") + //上传图片 +// uploadFileViewModel.uploadImage(context, file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt index 2ebff9f..274637f 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/UploadEventActivity.kt @@ -17,7 +17,7 @@ import com.casic.br.operationsite.model.UserDetailModel import com.casic.br.operationsite.utils.GlideLoadEngine import com.casic.br.operationsite.utils.LocaleConstant -import com.casic.br.operationsite.utils.LocationHelper +import com.casic.br.operationsite.utils.LocationKit import com.casic.br.operationsite.vm.EventViewModel import com.casic.br.operationsite.vm.UploadFileViewModel import com.google.gson.Gson @@ -88,7 +88,21 @@ } uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + uploadFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val url = it.data.toString() + imagePaths.add(url) + recyclerViewImages.add(url.combineImagePath()) + imageAdapter.notifyDataSetChanged() + } + } + eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] + eventViewModel.resultModel.observe(this) { + if (it.code == 200) { + finish() + } + } //左右边距 val viewWidth = getScreenWidth() - (10 + 10).dp2px(this) @@ -143,15 +157,6 @@ } }) - uploadFileViewModel.resultModel.observe(this) { - if (it.code == 200) { - val url = it.data.toString() - imagePaths.add(url) - recyclerViewImages.add(url.combineImagePath()) - imageAdapter.notifyDataSetChanged() - } - } - binding.siteEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { @@ -202,12 +207,6 @@ mapLocation?.latitude.toString(), ) } - - eventViewModel.resultModel.observe(this) { - if (it.code == 200) { - finish() - } - } } private fun selectPicture() { @@ -264,7 +263,7 @@ private fun getCurrentLocation() { binding.eventLocationView.text = "定位中..." - LocationHelper.getCurrentLocation(this, object : LocationHelper.ILocationListener { + LocationKit.getCurrentLocation(this, object : LocationKit.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { if (aMapLocation == null) { binding.eventLocationView.text = "定位失败" diff --git a/app/src/main/res/drawable/ic_location_install.xml b/app/src/main/res/drawable/ic_location_install.xml new file mode 100644 index 0000000..0db0eb9 --- /dev/null +++ b/app/src/main/res/drawable/ic_location_install.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_install_equipment.xml b/app/src/main/res/layout/activity_install_equipment.xml index 1b5381a..507d538 100644 --- a/app/src/main/res/layout/activity_install_equipment.xml +++ b/app/src/main/res/layout/activity_install_equipment.xml @@ -12,4 +12,167 @@ android:layout_height="wrap_content" android:background="@color/mainThemeColor" app:tbv_text="设备录入" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +