package com.casic.smarttube.view import android.content.Context import android.graphics.Color import android.os.CountDownTimer import android.os.Handler import android.text.Editable import android.text.TextWatcher import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener import com.casic.smarttube.extensions.* import com.casic.smarttube.extensions.isNumber import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.* import com.casic.smarttube.vm.DeviceViewModel import com.casic.smarttube.vm.ProjectGroupViewModel import com.casic.smarttube.vm.UploadImageViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.gyf.immersionbar.ImmersionBar 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.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_add_device.* import kotlinx.android.synthetic.main.activity_history_data.* import kotlinx.android.synthetic.main.include_base_title.* import kotlinx.android.synthetic.main.include_base_title.leftBackView import java.io.File import java.util.* import kotlin.collections.ArrayList class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var dialogManager: DialogManager private lateinit var imageAdapter: EditableImageAdapter private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel private val context: Context = this@AddDeviceActivity private val imagePaths: ArrayList<String> = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList<String> = ArrayList() //真实图片路径 private val frequency = listOf("1min", "2min", "5min", "10min", "15min", "30min", "60min") private var selectedImages = ArrayList<LocalMedia>() private var ownerShip = "" override fun initLayoutView(): Int = R.layout.activity_add_device override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) titleView.text = "添加设备" leftBackView.setOnClickListener { finish() } } override fun initData() { dialogManager = DialogManager.obtainInstance(this) weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this, { val groups = ArrayList<String>() if (it.code == 200) { if (it.data.isEmpty()) { groups.add("自定义") } else { it.data.forEach { id -> groups.add(id) } groups.add("自定义") } } else { groups.add("自定义") } if (groups.isNotEmpty()) { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { AlertInputDialog.Builder() .setContext(context) .setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { } override fun onConfirmClick(value: String) { ownerShipView.text = value } }) .build().show() } else { ownerShipView.text = groups[position] } } }).build().show() } }) //默认频率1min collectIntervalView.text = frequency[0] collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { collectIntervalView.text = frequency[position] } }).build().show() } locationImageView.setOnClickListener { dialogManager.showLoadingDialog("定位中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { dialogManager.dismissLoadingDialog() if (aMapLocation == null) { longitudeView.text = "定位失败" latitudeView.text = "定位失败" longitudeView.setTextColor(R.color.redTextColor.convertColor(context)) latitudeView.setTextColor(R.color.redTextColor.convertColor(context)) } else { longitudeView.text = aMapLocation.longitude.toString() latitudeView.text = aMapLocation.latitude.toString() longitudeView.setTextColor(R.color.mainTextColor.convertColor(context)) latitudeView.setTextColor(R.color.mainTextColor.convertColor(context)) } } }) } imageAdapter = EditableImageAdapter(this, 3, 13f) addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() } override fun onItemClick(position: Int) { if (realPaths[position].isEmpty()) { "图片加载失败,无法查看大图".show(context) } else { navigatePageTo<BigImageActivity>(position, realPaths) } } override fun onItemLongClick(view: View?, position: Int) { imagePaths.removeAt(position) imageAdapter.deleteImage(position) } }) uploadImageViewModel.resultModel.observe(this, { if (it.code == 200) { if (imageAdapter.itemCount == selectedImages.size) { dialogManager.dismissLoadingDialog() } if (imageAdapter.itemCount <= 3) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) realPaths.add(url.combineImagePath()) } imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show(this) } } }) sceneEditView.addTextChangedListener(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?) { val text = s.toString().trim() inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() submitButton.setOnClickListener { val deviceCode = deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } val ownerShip = ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } val longitude = longitudeView.text.toString().trim() val latitude = latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener } val userDetailJson = SaveKeyValues.getValue(LocaleConstant.USER_DETAIL_MODEL, "") as String if (userDetailJson.isNotBlank()) { val userData = Gson().fromJson<UserDetailModel.Data>( userDetailJson, object : TypeToken<UserDetailModel.Data>() {}.type ) deviceViewModel.addDevice( deviceCode, deviceNameView.text.toString(), ownerShip, collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), sceneEditView.text.toString().trim(), addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) } } deviceViewModel.loadState.observe(this, { when (it) { LoadState.Loading -> dialogManager.showLoadingDialog("处理中,请稍后") LoadState.Success -> { Log.d(kTag, "initEvent: 成功") dialogManager.dismissLoadingDialog() this.finish() } LoadState.Fail -> dialogManager.dismissLoadingDialog() } }) } private fun selectPicture() { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { PictureSelector.create(context) .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener<LocalMedia> { override fun onResult(result: ArrayList<LocalMedia>?) { if (result == null) { "拍照保存失败,请重试".show(context) return } dialogManager.showLoadingDialog("图片上传中,请稍后...") selectedImages = result analyticalSelectResults(result[0]) } override fun onCancel() { } }) } 1 -> { PictureSelector.create(context) .openGallery(SelectMimeType.ofImage()) .isGif(false) .isMaxSelectEnabledMask(true) .setFilterMinFileSize(100) .setMaxSelectNum(3) .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener<LocalMedia> { override fun onResult(result: ArrayList<LocalMedia>?) { if (result == null) { "选择照片失败,请重试".show(context) return } dialogManager.showLoadingDialog("图片上传中,请稍后...") selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 val sum = (result.size * 500).toLong() object : CountDownTimer(sum, 500) { override fun onTick(millisUntilFinished: Long) { val i = millisUntilFinished / 500 val message = weakReferenceHandler.obtainMessage() message.obj = result[i.toInt()] message.what = 2022062501 weakReferenceHandler.handleMessage(message) } override fun onFinish() { } }.start() } override fun onCancel() { } }) } } } }).build().show() } private val callback = Handler.Callback { if (it.what == 2022062501) { analyticalSelectResults(it.obj as LocalMedia) } true } private fun analyticalSelectResults(result: LocalMedia) { result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 uploadImageViewModel.uploadImage(file) } override fun onError(e: Throwable) { e.printStackTrace() } }) } }