diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index e9a4533..8c6aed7 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78112af..bd10711 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,8 @@ + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index e9a4533..8c6aed7 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/fragment_device_fireplace_control.xml b/app/src/main/res/layout/fragment_device_fireplace_control.xml index 2b7fdc0..513982d 100644 --- a/app/src/main/res/layout/fragment_device_fireplace_control.xml +++ b/app/src/main/res/layout/fragment_device_fireplace_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> @@ -44,6 +44,7 @@ android:layout_marginTop="@dimen/dp_10" android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical" + android:paddingHorizontal="@dimen/dp_20" android:paddingVertical="@dimen/dp_10"> + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="舒适" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="节能" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="夏季" /> - - - - - - - - - + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index e9a4533..8c6aed7 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/fragment_device_fireplace_control.xml b/app/src/main/res/layout/fragment_device_fireplace_control.xml index 2b7fdc0..513982d 100644 --- a/app/src/main/res/layout/fragment_device_fireplace_control.xml +++ b/app/src/main/res/layout/fragment_device_fireplace_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> @@ -44,6 +44,7 @@ android:layout_marginTop="@dimen/dp_10" android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical" + android:paddingHorizontal="@dimen/dp_20" android:paddingVertical="@dimen/dp_10"> + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="舒适" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="节能" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="夏季" /> - - - - - - - - - @@ -54,59 +54,38 @@ + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="低档" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="高档" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="爆炒" /> - - - - - - - - - + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index e9a4533..8c6aed7 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/fragment_device_fireplace_control.xml b/app/src/main/res/layout/fragment_device_fireplace_control.xml index 2b7fdc0..513982d 100644 --- a/app/src/main/res/layout/fragment_device_fireplace_control.xml +++ b/app/src/main/res/layout/fragment_device_fireplace_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> @@ -44,6 +44,7 @@ android:layout_marginTop="@dimen/dp_10" android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical" + android:paddingHorizontal="@dimen/dp_20" android:paddingVertical="@dimen/dp_10"> + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="舒适" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="节能" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="夏季" /> - - - - - - - - - @@ -54,59 +54,38 @@ + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="低档" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="高档" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="爆炒" /> - - - - - - - - - @@ -261,81 +261,54 @@ - - - - - - - - - - - - - - - + + + "火灾报警器" "rqbj" -> "燃气报警器" "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" else -> "其他" } } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index 1bdd94d..fa90b52 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -174,6 +174,10 @@ //一氧化碳报警器 requireContext().navigatePageTo() } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..5185a18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,268 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.activity_water_dispenser.modeRadioGroup +import kotlinx.android.synthetic.main.fragment_device_waterheater_control.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + val switchState = parseObject[it] as Boolean + switchCheckBox.isChecked = switchState + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index e221d61..05a735b 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_gas_check_box.xml b/app/src/main/res/drawable/selector_clear_gas_check_box.xml deleted file mode 100644 index 8654938..0000000 --- a/app/src/main/res/drawable/selector_clear_gas_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_clear_water_check_box.xml b/app/src/main/res/drawable/selector_clear_water_check_box.xml deleted file mode 100644 index c9ee9e9..0000000 --- a/app/src/main/res/drawable/selector_clear_water_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_device_turn_off.xml b/app/src/main/res/drawable/selector_device_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_device_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_high_speed_radio_button.xml b/app/src/main/res/drawable/selector_high_speed_radio_button.xml deleted file mode 100644 index c31bd2e..0000000 --- a/app/src/main/res/drawable/selector_high_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml deleted file mode 100644 index 9805d65..0000000 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_low_speed_radio_button.xml b/app/src/main/res/drawable/selector_low_speed_radio_button.xml deleted file mode 100644 index 440fe6d..0000000 --- a/app/src/main/res/drawable/selector_low_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_max_speed_radio_button.xml b/app/src/main/res/drawable/selector_max_speed_radio_button.xml deleted file mode 100644 index 95f9fde..0000000 --- a/app/src/main/res/drawable/selector_max_speed_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_once_image_radio_button.xml b/app/src/main/res/drawable/selector_once_image_radio_button.xml deleted file mode 100644 index fc936c6..0000000 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_power_strip_turn_off.xml b/app/src/main/res/drawable/selector_power_strip_turn_off.xml new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_power_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml deleted file mode 100644 index ba3bdd1..0000000 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_high_speed.xml b/app/src/main/res/drawable/selector_range_hood_high_speed.xml new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_high_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_low_speed.xml b/app/src/main/res/drawable/selector_range_hood_low_speed.xml new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_low_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_range_hood_max_speed.xml b/app/src/main/res/drawable/selector_range_hood_max_speed.xml new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_range_hood_max_speed.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml deleted file mode 100644 index 3f211ce..0000000 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_single_strip_turn_off.xml b/app/src/main/res/drawable/selector_single_strip_turn_off.xml new file mode 100644 index 0000000..eb97bc9 --- /dev/null +++ b/app/src/main/res/drawable/selector_single_strip_turn_off.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_check_box.xml b/app/src/main/res/drawable/selector_turn_off_check_box.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_check_box.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_radio_button.xml b/app/src/main/res/drawable/selector_turn_off_radio_button.xml deleted file mode 100644 index 3b719e1..0000000 --- a/app/src/main/res/drawable/selector_turn_off_radio_button.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_turn_off_single_strip.xml b/app/src/main/res/drawable/selector_turn_off_single_strip.xml deleted file mode 100644 index eb97bc9..0000000 --- a/app/src/main/res/drawable/selector_turn_off_single_strip.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_dispenser_normal.xml b/app/src/main/res/drawable/selector_water_dispenser_normal.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_dispenser_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_gas.xml b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml new file mode 100644 index 0000000..8654938 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_gas.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_clear_water.xml b/app/src/main/res/drawable/selector_water_heater_clear_water.xml new file mode 100644 index 0000000..c9ee9e9 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_clear_water.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_initiate.xml b/app/src/main/res/drawable/selector_water_heater_initiate.xml new file mode 100644 index 0000000..9805d65 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_initiate.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_once.xml b/app/src/main/res/drawable/selector_water_heater_once.xml new file mode 100644 index 0000000..fc936c6 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_once.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_pressure.xml b/app/src/main/res/drawable/selector_water_heater_pressure.xml new file mode 100644 index 0000000..ba3bdd1 --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_pressure.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_water_heater_reservation.xml b/app/src/main/res/drawable/selector_water_heater_reservation.xml new file mode 100644 index 0000000..3f211ce --- /dev/null +++ b/app/src/main/res/drawable/selector_water_heater_reservation.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..84f7c76 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_consume.xml b/app/src/main/res/layout/activity_gas_consume.xml index 9f0a836..cc916a1 100644 --- a/app/src/main/res/layout/activity_gas_consume.xml +++ b/app/src/main/res/layout/activity_gas_consume.xml @@ -229,7 +229,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/selector_clear_water_check_box" + android:background="@drawable/selector_water_heater_clear_water" android:button="@null" /> @@ -120,7 +120,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -148,7 +148,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> @@ -175,7 +175,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_10" - android:background="@drawable/selector_turn_off_check_box" + android:background="@drawable/selector_power_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..b3a661a --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index e9a4533..8c6aed7 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/fragment_device_fireplace_control.xml b/app/src/main/res/layout/fragment_device_fireplace_control.xml index 2b7fdc0..513982d 100644 --- a/app/src/main/res/layout/fragment_device_fireplace_control.xml +++ b/app/src/main/res/layout/fragment_device_fireplace_control.xml @@ -31,7 +31,7 @@ android:id="@+id/turnOffRadioButton" android:layout_width="@dimen/titleViewHeight" android:layout_height="@dimen/titleViewHeight" - android:background="@drawable/selector_turn_off_radio_button" + android:background="@drawable/selector_device_turn_off" android:button="@null" android:gravity="center" /> @@ -44,6 +44,7 @@ android:layout_marginTop="@dimen/dp_10" android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical" + android:paddingHorizontal="@dimen/dp_20" android:paddingVertical="@dimen/dp_10"> + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="舒适" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="节能" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="夏季" /> - - - - - - - - - @@ -54,59 +54,38 @@ + android:drawableTop="@drawable/selector_range_hood_low_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="低档" /> + android:drawableTop="@drawable/selector_range_hood_high_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="高档" /> + android:drawableTop="@drawable/selector_range_hood_max_speed" + android:drawablePadding="@dimen/dp_5" + android:gravity="center" + android:text="爆炒" /> - - - - - - - - - @@ -261,81 +261,54 @@ - - - - - - - - - - - - - - - + 100dp 115dp 125dp + 150dp + 175dp 200dp 220dp 300dp