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 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()
        }
    }
}