Newer
Older
CasicSmartTube / app / src / main / java / com / casic / smarttube / view / AddDeviceActivity.kt
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()
            }
        })
    }
}