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 androidx.recyclerview.widget.GridLayoutManager import cn.bertsir.zbar.QrManager import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.extensions.combineImagePath 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.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUITipDialog 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 { showLoadingDialog(this, "定位中中,请稍后...") LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { override fun onAMapLocationGet(aMapLocation: AMapLocation?) { 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) addImageRecyclerView.layoutManager = GridLayoutManager(this, 3) 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, { 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>?) { showLoadingDialog(context, "图片上传中,请稍后...") 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() // } // }) } private lateinit var loadingDialog: QMUITipDialog fun showLoadingDialog(context: Context?, message: String?) { loadingDialog = QMUITipDialog.Builder(context) .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) .setTipWord(message) .create() loadingDialog.show() } fun dismissLoadingDialog() { if (loadingDialog.isShowing) { loadingDialog.dismiss() } } }