diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png new file mode 100644 index 0000000..d141d05 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png new file mode 100644 index 0000000..d141d05 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed.png b/app/src/main/res/mipmap-xxhdpi/low_speed.png new file mode 100644 index 0000000..61499a4 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png new file mode 100644 index 0000000..d141d05 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed.png b/app/src/main/res/mipmap-xxhdpi/low_speed.png new file mode 100644 index 0000000..61499a4 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed_main.png b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png new file mode 100644 index 0000000..6c93621 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png new file mode 100644 index 0000000..d141d05 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed.png b/app/src/main/res/mipmap-xxhdpi/low_speed.png new file mode 100644 index 0000000..61499a4 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed_main.png b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png new file mode 100644 index 0000000..6c93621 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/max_speed.png b/app/src/main/res/mipmap-xxhdpi/max_speed.png new file mode 100644 index 0000000..a284e80 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/max_speed.png Binary files differ diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt new file mode 100644 index 0000000..2cb7b3c --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -0,0 +1,292 @@ +package com.casic.br.fragment.rangehood + +import android.graphics.Color +import android.os.Handler +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.disableLayout +import com.casic.br.extensions.enableLayout +import com.casic.br.utils.CommandManager +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_rangehood_control.* + +class ControlPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "ControlPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_control + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + //开关机 + turnOffRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + } + + lowSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + highSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + maxSpeedRadioButton.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } + + //清洁 + cleanSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) + } + + //照明 + lightSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) + } + + //巡航 + cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) + } + + //延时开关 + delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) + } + + //假日通风 + ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + //假日通风时长 + val timeArray = arrayListOf( + "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" + ) + ventilateTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setActionItemTitle(timeArray) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "103".createCommand(timeArray[position].toInt()) + ) + } + }).build().show() + } + + //防倒灌 + antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> + CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) + } + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092301) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + if (isDeviceWorking) { + /** + * 已开机 + * */ + deviceStateButton.text = "关机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + /** + * 已关机 + * */ + deviceStateButton.text = "开机" + + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} + val isDelay = parseObject[it] as Boolean + delayTurnOffSwitch.isChecked = isDelay + if (isDeviceWorking) { + delayLayout.enableLayout(delayTurnOffSwitch) + } else { + delayLayout.disableLayout(delayTurnOffSwitch) + } + } + "4" -> {//照明 + val isLighting = parseObject[it] as Boolean + lightSwitch.isChecked = isLighting + } + "10" -> {//风速 + when (parseObject[it] as String) { + "low" -> lowSpeedRadioButton.isChecked = true + "high" -> highSpeedRadioButton.isChecked = true + "strong" -> maxSpeedRadioButton.isChecked = true + else -> { + lowSpeedRadioButton.isChecked = false + highSpeedRadioButton.isChecked = false + maxSpeedRadioButton.isChecked = false + } + } + } + "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} + val isCleaning = parseObject[it] as Boolean + cleanSwitch.isChecked = isCleaning + if (isCleaning) { + modeLayout.disableLayout( + lowSpeedRadioButton, highSpeedRadioButton, maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.disableLayout(cruiseSwitch) + delayLayout.disableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + lightLayout.enableLayout(lightSwitch) + cruiseLayout.enableLayout(cruiseSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } + "102" -> {//假日通风 + val isVentilating = parseObject[it] as Boolean + ventilateSwitch.isChecked = isVentilating + if (isVentilating) { + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + } + } + "103" -> {//通风时长 + ventilateTimeView.text = + String.format("${parseObject[it].toString()}min") + } + "104" -> {//巡航 + val isCruising = parseObject[it] as Boolean + cruiseSwitch.isChecked = isCruising + if (isCruising) { + if (isDeviceWorking) { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.enableLayout(ventilateSwitch) + if (ventilateSwitch.isChecked) { + ventilateTimeLayout.enableLayout(ventilateTimeView) + } else { + ventilateTimeLayout.disableLayout(ventilateTimeView) + } + antiPourDownLayout.enableLayout(antiPourDownSwitch) + } + } else { + modeLayout.enableLayout( + lowSpeedRadioButton, + highSpeedRadioButton, + maxSpeedRadioButton + ) + cleanLayout.enableLayout(cleanSwitch) + lightLayout.enableLayout(lightSwitch) + delayLayout.enableLayout(delayTurnOffSwitch) + ventilateLayout.disableLayout(ventilateSwitch) + ventilateTimeLayout.disableLayout(ventilateTimeView) + antiPourDownLayout.disableLayout(antiPourDownSwitch) + } + } + "108" -> {//防倒灌 + val isAntiPourDown = parseObject[it] as Boolean + antiPourDownSwitch.isChecked = isAntiPourDown + } + } + } + } + true + } + + 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/fragment/rangehood/ServicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt new file mode 100644 index 0000000..244cff4 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ServicePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.rangehood + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class ServicePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_service + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt new file mode 100644 index 0000000..bd68eeb --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -0,0 +1,131 @@ +package com.casic.br.fragment.rangehood + +import android.os.Handler +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.diffDate +import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.fragment_device_rangehood_status.* + +class StatusPageFragment(private val deviceId: String) : KotlinBaseFragment() { + + companion object { + lateinit var weakReference: WeakReferenceHandler + } + + private val kTag = "StatusPageFragment" + private lateinit var deviceInstance: ITuyaDevice + private var isDeviceWorking = false + + override fun initLayoutView(): Int = R.layout.fragment_device_rangehood_status + + override fun setupTopBarLayout() { + + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + if (homeId == "") { + return + } + TuyaHomeSdk.newHomeInstance(homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + deviceList.forEach { + if (it.deviceCategory == "yyj") { + deviceUsedTimeView.text = + String.format("${it.time.toString().diffDate()}天") + } + return@forEach + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + deviceStateView.text = if (!isDeviceWorking) { + "已关机" + } else { + "工作中" + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022092302) { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + } + "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] + val status = parseObject[it] as String + deviceStateView.text = if (status == "off") { + "已关机" + } else { + "工作中" + } + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[it]}分" + } else { + "0分" + } + } + "106" -> {//烟灶联动 + val isLinkage = parseObject[it] as Boolean + linkageView.text = if (isLinkage) { + "开" + } else { + "关" + } + } + "107" -> {//倒油提醒 + val isPourOil = parseObject[it] as Boolean + pourOilView.text = if (isPourOil) { + "开" + } else { + "关" + } + } + } + } + } + true + } + + 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/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index babe659..29b67b1 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -30,6 +30,7 @@ val GENDER_ARRAY = arrayListOf("男", "女") val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") + val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") val CONNECT_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index 4deb17a..12d120d 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,29 +1,31 @@ package com.casic.br.view.device -import android.graphics.Color +import android.graphics.Typeface import android.util.Log +import android.view.LayoutInflater +import android.widget.TextView +import androidx.fragment.app.Fragment import com.alibaba.fastjson.JSONObject import com.bumptech.glide.Glide import com.casic.br.R -import com.casic.br.extensions.createCommand -import com.casic.br.extensions.disableLayout -import com.casic.br.extensions.enableLayout +import com.casic.br.adapter.TabPagerAdapter import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.fragment.rangehood.ControlPageFragment +import com.casic.br.fragment.rangehood.ServicePageFragment +import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager -import com.google.gson.Gson +import com.casic.br.utils.LocaleConstant +import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice -import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.activity_range_hood.* -import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView -import kotlinx.android.synthetic.main.activity_water_heater.rootView import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* /** * 油烟机 @@ -31,11 +33,9 @@ class RangeHoodActivity : KotlinBaseActivity() { private val kTag = "RangeHoodActivity" - private val gson by lazy { Gson() } - private lateinit var deviceId: String + private val inflater by lazy { LayoutInflater.from(this) } + private var fragmentPages: ArrayList = ArrayList() private lateinit var deviceInstance: ITuyaDevice - private var deviceBean: DeviceBean? = null - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.activity_range_hood @@ -48,107 +48,27 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = "油烟机" } override fun initData() { - deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! - Log.d(kTag, "deviceId: $deviceId") - + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) - } - override fun onResume() { - super.onResume() - deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) if (deviceBean == null) { "查询设备信息失败,请检查设备是否已离线".show(this) return } - + titleView.text = "万家乐油烟机" Glide.with(this) - .load(deviceBean?.iconUrl) + .load(deviceBean.iconUrl) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - - override fun initEvent() { - rightOperateView.setOnClickListener { - - } - - //开关机 - switchButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - //低速 - lowSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) - } - - //高速 - highSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - - //爆炒 - maxSpeedView.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) - } - - //清洁 - cleanSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //照明 - lightSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "4".createCommand(isChecked)) - } - - //巡航 - cruiseSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(isChecked)) - } - - //延时开关 - delayTurnOffSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "2".createCommand(isChecked)) - } - - //假日通风 - ventilateSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //假日通风时长 - val timeArray = arrayListOf( - "10", "20", "30", "40", "50", "60", "70", "80", "90", "100", "110", "120" - ) - ventilateTimeLayout.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setActionItemTitle(timeArray) - .setItemTextColor(Color.BLUE) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - CommandManager.sendTuyaDp( - deviceInstance, "103".createCommand(timeArray[position].toInt()) - ) - } - }).build().show() - } - - //防倒灌 - antiPourDownSwitch.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "108".createCommand(isChecked)) - } + fragmentPages.add(ControlPageFragment(deviceId)) + fragmentPages.add(StatusPageFragment(deviceId)) + fragmentPages.add(ServicePageFragment()) deviceInstance.registerDevListener(object : IDevListener { @@ -161,189 +81,36 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) + var isWorking = false + var isDelayed = false parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - if (isDeviceWorking) { - /** - * 已开机 - * */ - deviceStateButton.text = "关机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - /** - * 已关机 - * */ - deviceStateButton.text = "开机" - - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } + "1" -> { + isWorking = parseObject[it] as Boolean } - "2" -> {//延时关机状态,{"105":90,"11":"delay","2":true}|{"11":"low","2":false} - val isDelay = parseObject[it] as Boolean - if (!isDelay) { - delayTimeView.text = "已取消" - } - delayTurnOffSwitch.isChecked = isDelay - if (isDeviceWorking) { - delayLayout.enableLayout(delayTurnOffSwitch) - } else { - delayLayout.disableLayout(delayTurnOffSwitch) - } + "2" -> { + isDelayed = parseObject[it] as Boolean } - "4" -> {//照明 - val isLighting = parseObject[it] as Boolean - lightSwitch.isChecked = isLighting - } - "10" -> {//风速 - - } - "11" -> {//设备状态,[off, low, high, strong, air, fangdaoguan, wash, delay, xunhang] - val status = parseObject[it] as String - deviceStateView.text = if (status == "off") { - "已关机" - } else { - "工作中" - } - } - "12" -> {//累计工作时间 - workingTimeView.text = if (isDeviceWorking) { - "${parseObject[it]}分" - } else { - "0分" - } - } - "101" -> {//清洁,{"10":"off","101":true,"11":"wash"}|{"101":false,"11":"off"} - val isCleaning = parseObject[it] as Boolean - cleanSwitch.isChecked = isCleaning - if (isCleaning) { - modeLayout.disableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.disableLayout(cruiseSwitch) - delayLayout.disableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - lightLayout.enableLayout(lightSwitch) - cruiseLayout.enableLayout(cruiseSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } - "102" -> {//假日通风 - val isVentilating = parseObject[it] as Boolean - ventilateSwitch.isChecked = isVentilating - if (isVentilating) { - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - } - } - "103" -> {//通风时长 - ventilateTimeView.text = - String.format("${parseObject[it].toString()}min") - } - "104" -> {//巡航 - val isCruising = parseObject[it] as Boolean - cruiseSwitch.isChecked = isCruising - if (isCruising) { - if (isDeviceWorking) { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } else { - modeLayout.enableLayout( - lowSpeedView, highSpeedView, maxSpeedView - ) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.enableLayout(ventilateSwitch) - if (ventilateSwitch.isChecked) { - ventilateTimeLayout.enableLayout(ventilateTimeView) - } else { - ventilateTimeLayout.disableLayout(ventilateTimeView) - } - antiPourDownLayout.enableLayout(antiPourDownSwitch) - } - } else { - modeLayout.enableLayout(lowSpeedView, highSpeedView, maxSpeedView) - cleanLayout.enableLayout(cleanSwitch) - lightLayout.enableLayout(lightSwitch) - delayLayout.enableLayout(delayTurnOffSwitch) - ventilateLayout.disableLayout(ventilateSwitch) - ventilateTimeLayout.disableLayout(ventilateTimeView) - antiPourDownLayout.disableLayout(antiPourDownSwitch) - } - } - "105" -> {//延时关机倒计时 + "105" -> { delayTimeView.text = - if (isDeviceWorking && delayTurnOffSwitch.isChecked) { + if (isWorking && isDelayed) { String.format("${parseObject[it].toString()}s") } else { "0s" } } - "106" -> {//烟灶联动 - val isLinkage = parseObject[it] as Boolean - linkageView.text = if (isLinkage) { - "开" - } else { - "关" - } - } - "107" -> {//倒油提醒 - val isPourOil = parseObject[it] as Boolean - pourOilView.text = if (isPourOil) { - "开" - } else { - "关" - } - } - "108" -> {//防倒灌 - val isAntiPourDown = parseObject[it] as Boolean - antiPourDownSwitch.isChecked = isAntiPourDown - } } } + + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092301 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092302 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) } /** @@ -386,6 +153,39 @@ }) } + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + + } + + deviceViewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) + deviceTabLayout.setupWithViewPager(deviceViewPager) + deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val textView = inflater.inflate(R.layout.item_top_tab, null) as TextView + textView.textSize = 16f + textView.typeface = Typeface.DEFAULT_BOLD + textView.text = tab!!.text + tab.customView = textView + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + tab?.customView = null + } + + override fun onTabReselected(tab: TabLayout.Tab?) { + + } + }) + } + override fun onDestroy() { super.onDestroy() deviceInstance.unRegisterDevListener() 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 9756a5e..e629a34 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 @@ -11,6 +11,7 @@ import com.casic.br.fragment.waterheater.ControlPageFragment import com.casic.br.fragment.waterheater.ServicePageFragment import com.casic.br.fragment.waterheater.StatusPageFragment +import com.casic.br.utils.LocaleConstant import com.google.android.material.tabs.TabLayout import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -27,7 +28,6 @@ private val context: Context = this@WaterHeaterActivity private val inflater by lazy { LayoutInflater.from(this) } - private val deviceSegmentTitle = arrayOf("设备控制", "状态显示", "服务设置") private var fragmentPages: ArrayList = ArrayList() init { @@ -60,7 +60,7 @@ } deviceViewPager.adapter = - TabPagerAdapter(fragmentPages, deviceSegmentTitle, supportFragmentManager) + TabPagerAdapter(fragmentPages, LocaleConstant.DEVICE_PAGE_TITLE, supportFragmentManager) deviceTabLayout.setupWithViewPager(deviceViewPager) deviceTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { diff --git a/app/src/main/res/drawable/ic_initiate.xml b/app/src/main/res/drawable/ic_initiate.xml deleted file mode 100644 index a7103b7..0000000 --- a/app/src/main/res/drawable/ic_initiate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_initiate_main.xml b/app/src/main/res/drawable/ic_initiate_main.xml deleted file mode 100644 index a51a14d..0000000 --- a/app/src/main/res/drawable/ic_initiate_main.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once.xml b/app/src/main/res/drawable/ic_once.xml deleted file mode 100644 index 24ca62a..0000000 --- a/app/src/main/res/drawable/ic_once.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_once_main.xml b/app/src/main/res/drawable/ic_once_main.xml deleted file mode 100644 index d3c05c6..0000000 --- a/app/src/main/res/drawable/ic_once_main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure.xml b/app/src/main/res/drawable/ic_pressure.xml deleted file mode 100644 index 95b14a4..0000000 --- a/app/src/main/res/drawable/ic_pressure.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ic_pressure_main.xml b/app/src/main/res/drawable/ic_pressure_main.xml deleted file mode 100644 index 59d0e04..0000000 --- a/app/src/main/res/drawable/ic_pressure_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_reservation.xml b/app/src/main/res/drawable/ic_reservation.xml deleted file mode 100644 index e7544d7..0000000 --- a/app/src/main/res/drawable/ic_reservation.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_reservation_main.xml b/app/src/main/res/drawable/ic_reservation_main.xml deleted file mode 100644 index 0e478b0..0000000 --- a/app/src/main/res/drawable/ic_reservation_main.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_test_check.xml b/app/src/main/res/drawable/ic_test_check.xml new file mode 100644 index 0000000..0ce5ab7 --- /dev/null +++ b/app/src/main/res/drawable/ic_test_check.xml @@ -0,0 +1,10 @@ + + + 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 new file mode 100644 index 0000000..c31bd2e --- /dev/null +++ b/app/src/main/res/drawable/selector_high_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 9a29246..9805d65 100644 --- a/app/src/main/res/drawable/selector_initiate_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_initiate_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..440fe6d --- /dev/null +++ b/app/src/main/res/drawable/selector_low_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 new file mode 100644 index 0000000..95f9fde --- /dev/null +++ b/app/src/main/res/drawable/selector_max_speed_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ 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 index 6cf1b3b..fc936c6 100644 --- a/app/src/main/res/drawable/selector_once_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_once_image_radio_button.xml @@ -1,5 +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 index 4f681d2..ba3bdd1 100644 --- a/app/src/main/res/drawable/selector_pressure_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_pressure_image_radio_button.xml @@ -1,5 +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 index 5babde1..3f211ce 100644 --- a/app/src/main/res/drawable/selector_reservation_image_radio_button.xml +++ b/app/src/main/res/drawable/selector_reservation_image_radio_button.xml @@ -1,5 +1,5 @@ - - + + \ 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 new file mode 100644 index 0000000..3b719e1 --- /dev/null +++ b/app/src/main/res/drawable/selector_turn_off_radio_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 2a1419e..7460bd1 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,6 @@ - + android:layout_height="match_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> - + + + + + + + android:layout_height="@dimen/dp_40" + android:layout_marginHorizontal="@dimen/dp_40" + android:layout_marginVertical="10dp" + app:tabIndicatorHeight="0dp" + app:tabSelectedTextColor="@color/mainThemeColor" + app:tabTextColor="@color/subMainThemeColor" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_heater.xml b/app/src/main/res/layout/activity_water_heater.xml index 836ee10..1bd9505 100644 --- a/app/src/main/res/layout/activity_water_heater.xml +++ b/app/src/main/res/layout/activity_water_heater.xml @@ -21,20 +21,12 @@ android:layout_height="wrap_content" android:src="@mipmap/rsq" /> - - @@ -43,7 +35,6 @@ android:id="@+id/deviceViewPager" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginTop="@dimen/dp_15" android:layout_weight="1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_control.xml b/app/src/main/res/layout/fragment_device_rangehood_control.xml new file mode 100644 index 0000000..e424c45 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_device_rangehood_service.xml b/app/src/main/res/layout/fragment_device_rangehood_service.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_service.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_rangehood_status.xml b/app/src/main/res/layout/fragment_device_rangehood_status.xml new file mode 100644 index 0000000..bed2330 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_rangehood_status.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_waterheater_control.xml b/app/src/main/res/layout/fragment_device_waterheater_control.xml index 285a9b2..76b6b7b 100644 --- a/app/src/main/res/layout/fragment_device_waterheater_control.xml +++ b/app/src/main/res/layout/fragment_device_waterheater_control.xml @@ -16,8 +16,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_10" - android:paddingVertical="@dimen/dp_10"> + android:padding="@dimen/dp_10"> - + - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed.png b/app/src/main/res/mipmap-xxhdpi/high_speed.png new file mode 100644 index 0000000..1e2b18a --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/high_speed_main.png b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png new file mode 100644 index 0000000..e208014 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/high_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png new file mode 100644 index 0000000..74631e6 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png new file mode 100644 index 0000000..728fcd8 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_initiate_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once.png b/app/src/main/res/mipmap-xxhdpi/ic_once.png new file mode 100644 index 0000000..19eeb88 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_once_main.png b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png new file mode 100644 index 0000000..7568a6e --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_once_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png new file mode 100644 index 0000000..a94d6fd --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png new file mode 100644 index 0000000..a86adcb --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_pressure_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png new file mode 100644 index 0000000..9f53f97 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png new file mode 100644 index 0000000..53c1269 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_reservation_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png new file mode 100644 index 0000000..9802d04 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png new file mode 100644 index 0000000..d141d05 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/ic_turn_off_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed.png b/app/src/main/res/mipmap-xxhdpi/low_speed.png new file mode 100644 index 0000000..61499a4 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/low_speed_main.png b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png new file mode 100644 index 0000000..6c93621 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/low_speed_main.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/max_speed.png b/app/src/main/res/mipmap-xxhdpi/max_speed.png new file mode 100644 index 0000000..a284e80 --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/max_speed.png Binary files differ diff --git a/app/src/main/res/mipmap-xxhdpi/max_speed_main.png b/app/src/main/res/mipmap-xxhdpi/max_speed_main.png new file mode 100644 index 0000000..feecf2b --- /dev/null +++ b/app/src/main/res/mipmap-xxhdpi/max_speed_main.png Binary files differ