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.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.utils.DialogHelper import com.casic.smarttube.utils.GlideLoadEngine import com.casic.smarttube.utils.LocationHelper import com.casic.smarttube.utils.QrConfigCreator import com.casic.smarttube.vm.UploadImageViewModel 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.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_add_device.* import kotlinx.android.synthetic.main.include_base_title.* import java.io.File class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var uploadImageViewModel: UploadImageViewModel private val context: Context = this@AddDeviceActivity private val imagePaths: ArrayList<String> = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList<String> = ArrayList() //真实图片路径 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() { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) scannerView.setOnClickListener { manager.startScan(this) { //TODO isNumber方法无效 if (it.content.isNumber()) { deviceCodeView.setText(it.content) deviceNameView.setText(String.format("管盯${it.content}")) } else { "设备编号错误,请检查标签".show(context) } } } ownerShipView.setOnClickListener { "尽情期待~".show(this) } collectIntervalView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setItemTextColor(Color.BLUE) .setActionItemTitle( listOf( "1min", "2min", "5min", "10min", "15min", "30min", "60min" ) ) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { } 1 -> { } 2 -> { } 3 -> { } 4 -> { } 5 -> { } 6 -> { } } } }).build().show() } locationImageView.setOnClickListener { DialogHelper.showLoadingDialog(this, "定位中中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { DialogHelper.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 addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() } override fun initEvent() { 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) { val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 if (sumItemCount <= 4) { val url = it.data.toString() if (url.isNotBlank()) { imagePaths.add(url) realPaths.add(url.combineImagePath()) } imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show(this) } } }) uploadImageViewModel.loadState.observe(this, { when (it) { LoadState.Loading -> { DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") } else -> { DialogHelper.dismissLoadingDialog() } } }) 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)) } } }) } 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 } 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 } // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 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) { //压缩图片 // val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { // result.realPath // } else { // result.sandboxPath // } // Log.d(kTag, "初始路径:" + result.path) // Log.d(kTag, "绝对路径:" + result.realPath) // Log.d(kTag, "原图路径:" + result.originalPath) // Log.d(kTag, "沙盒路径:" + result.sandboxPath) 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() } }) } }