diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_once_config.xml b/app/src/main/res/layout/activity_once_config.xml new file mode 100644 index 0000000..49a370e --- /dev/null +++ b/app/src/main/res/layout/activity_once_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_once_config.xml b/app/src/main/res/layout/activity_once_config.xml new file mode 100644 index 0000000..49a370e --- /dev/null +++ b/app/src/main/res/layout/activity_once_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_time_config.xml b/app/src/main/res/layout/activity_time_config.xml new file mode 100644 index 0000000..1accacb --- /dev/null +++ b/app/src/main/res/layout/activity_time_config.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index f3a2e9f..627fa46 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,4 +110,7 @@ implementation 'com.alibaba:fastjson:1.1.67.android' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9' implementation 'com.tuya.smart:tuyasmart:4.0.0' + //选择器 + implementation 'com.github.gzu-liyujiang.AndroidPicker:Common:4.1.8' + implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8e1fb2..c22d64a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,6 +55,9 @@ + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_once_config.xml b/app/src/main/res/layout/activity_once_config.xml new file mode 100644 index 0000000..49a370e --- /dev/null +++ b/app/src/main/res/layout/activity_once_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_time_config.xml b/app/src/main/res/layout/activity_time_config.xml new file mode 100644 index 0000000..1accacb --- /dev/null +++ b/app/src/main/res/layout/activity_time_config.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + \ 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 index e424c45..f9d5ecc 100644 --- a/app/src/main/res/layout/fragment_device_rangehood_control.xml +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -315,10 +315,7 @@ android:textColor="@color/hintTextColor" android:textSize="@dimen/sp_14" /> - + + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_once_config.xml b/app/src/main/res/layout/activity_once_config.xml new file mode 100644 index 0000000..49a370e --- /dev/null +++ b/app/src/main/res/layout/activity_once_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_time_config.xml b/app/src/main/res/layout/activity_time_config.xml new file mode 100644 index 0000000..1accacb --- /dev/null +++ b/app/src/main/res/layout/activity_time_config.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + \ 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 index e424c45..f9d5ecc 100644 --- a/app/src/main/res/layout/fragment_device_rangehood_control.xml +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -315,10 +315,7 @@ android:textColor="@color/hintTextColor" android:textSize="@dimen/sp_14" /> - + + + + (deviceId) + } + + //预约时间设定 + timeConfigLayout.setOnClickListener { + requireContext().navigatePageTo(deviceId) + } + + //水汽量消耗 + gasConsumeLayout.setOnClickListener { + + } } private val callback = Handler.Callback { message -> @@ -103,7 +175,19 @@ val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { + "1" -> {//开关机 + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "2" -> { + } + "9" -> {//温度设置 + + } + "111" -> {//厨房定时 + + } } } } diff --git a/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt new file mode 100644 index 0000000..ddf4d37 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/TuyaDeviceListener.kt @@ -0,0 +1,54 @@ +package com.casic.br.utils + +import com.tuya.smart.sdk.api.IDevListener + +open class TuyaDeviceListener : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } +} \ No newline at end of file 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 1649a16..4896125 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 @@ -15,13 +15,13 @@ import com.casic.br.fragment.rangehood.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.include_device_title.* @@ -72,14 +72,8 @@ fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { - /** - * DP 数据更新 - * - * @param devId 设备 ID - * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} - */ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") val parseObject = JSONObject.parseObject(dpStr) @@ -120,44 +114,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - /** - * 设备移除回调 - * - * @param devId 设备id - */ - override fun onRemoved(devId: String?) { - - } - - /** - * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 - * - * @param devId 设备 ID - * @param online 是否在线,在线为 true - */ - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - /** - * 网络状态发生变动时的回调 - * - * @param devId 设备 ID - * @param status 网络状态是否可用,可用为 true - */ - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - /** - * 设备信息更新回调 - * - * @param devId 设备 ID - */ - override fun onDevInfoUpdate(devId: String?) { - - } }) } 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 0aa6294..55dcbcb 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 @@ -6,7 +6,6 @@ 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.adapter.TabPagerAdapter @@ -16,13 +15,13 @@ import com.casic.br.fragment.waterheater.StatusPageFragment import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.TuyaDeviceListener 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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.sdk.api.IDevListener import com.tuya.smart.sdk.api.ITuyaDevice import kotlinx.android.synthetic.main.activity_range_hood.* import kotlinx.android.synthetic.main.activity_water_heater.* @@ -71,11 +70,11 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance)) + fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) - deviceInstance.registerDevListener(object : IDevListener { + deviceInstance.registerDevListener(object : TuyaDeviceListener() { override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") @@ -95,23 +94,6 @@ deviceBeanMsg.obj = deviceBean StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } - - override fun onRemoved(devId: String?) { - - } - - override fun onStatusChanged(devId: String?, online: Boolean) { - - } - - override fun onNetworkStatusChanged(devId: String?, status: Boolean) { - - } - - override fun onDevInfoUpdate(devId: String?) { - - } - }) } diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt new file mode 100644 index 0000000..56113f7 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/AddTimeConfigActivity.kt @@ -0,0 +1,84 @@ +package com.casic.br.view.device.waterheater + +import android.app.Activity +import android.content.Intent +import android.widget.TimePicker +import com.casic.br.R +import com.github.gzuliyujiang.wheelpicker.NumberPicker +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.sp2px +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_add_time_config.* +import kotlinx.android.synthetic.main.include_text_title.* +import java.util.* + + +class AddTimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "AddTimeConfigActivity" + private var selectedTime = "" + private var selectedTemp = "" + + override fun initLayoutView(): Int = R.layout.activity_add_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftTagView.setOnClickListener { finish() } + titleView.text = "添加预约" + } + + override fun initData() { + + } + + override fun initEvent() { + //设置点击事件不弹键盘 + startTimePicker.descendantFocusability = TimePicker.FOCUS_BLOCK_DESCENDANTS + startTimePicker.setIs24HourView(true) + val now = Calendar.getInstance() + startTimePicker.hour = now.get(Calendar.HOUR_OF_DAY) + startTimePicker.minute = now.get(Calendar.MINUTE) + selectedTime = "${startTimePicker.hour}:${startTimePicker.minute}" + startTimePicker.setOnTimeChangedListener { _, hourOfDay, minute -> + selectedTime = "$hourOfDay:$minute" + } + + selectedTemp = "36${resources.getString(R.string.temperature_unit)}" + tempView.text = selectedTemp + setTempLayout.setOnClickListener { + val picker = NumberPicker(this) + picker.wheelView.textSize = 12f.sp2px(this).toFloat() + picker.wheelView.selectedTextSize = 14f.sp2px(this).toFloat() + picker.setOnNumberPickedListener { _, item -> + selectedTemp = item.toString() + tempView.text = selectedTemp + } + picker.wheelLayout.setOnNumberSelectedListener { position, _ -> + picker.titleView.text = picker.wheelView.formatItem(position) + } + picker.setFormatter { item -> + "$item${resources.getString(R.string.temperature_unit)}" + } + picker.setRange(36, 60, 1) + picker.setDefaultValue(36) + picker.titleView.text = "水温" + picker.show() + } + + rightTagView.setOnClickListener { + val intent = Intent() + intent.putExtra("selectedTime", selectedTime) + intent.putExtra("selectedTemp", selectedTemp) + setResult(Activity.RESULT_OK, intent) + finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt new file mode 100644 index 0000000..9c64a9f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/OnceConfigActivity.kt @@ -0,0 +1,167 @@ +package com.casic.br.view.device.waterheater + +import android.graphics.Color +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_once_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class OnceConfigActivity : KotlinBaseActivity() { + + private val kTag = "OnceConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + private val onceTimeScope = arrayListOf( + "30s", + "1min", + "2min", + "3min", + "4min", + "5min", + "6min", + "7min", + "8min", + "9min", + "10min", + "11min", + "12min", + "13min", + "14min", + "15min" + ) + private val minTemp = 3 + private var maxTemp = 15 + private var currentProgress = 0 + private val keepTempTimeScope = arrayListOf( + "0min", + "30min", + "60min", + "90min", + "120min", + "150min", + "180min", + "240min", + "300min", + "720min" + ) + + override fun initLayoutView(): Int = R.layout.activity_once_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "单次参数设置" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + temperatureSlider.tickCount = abs(maxTemp - minTemp) + tempDiffView.text = + String.format("${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}") + minTempView.text = + String.format("$minTemp${resources.getString(R.string.temperature_unit)}") + maxTempView.text = + String.format("$maxTemp${resources.getString(R.string.temperature_unit)}") + +// deviceInstance.registerDevListener(object : TuyaDeviceListener() { +// +// override fun onDpUpdate(devId: String?, dpStr: String?) { +// Log.d(kTag, "onDpUpdate: $dpStr") +// val parseObject = JSONObject.parseObject(dpStr) +// parseObject.keys.forEach { +// when (it) { +// "112" -> { +// onceTimeView.text = parseObject[it] as String +// } +// "113" -> { +// tempDiffView.text = parseObject[it] as String +// } +// "114" -> { +// keepTempTimeView.text = parseObject[it] as String +// } +// } +// } +// } +// }) + } + + override fun initEvent() { + onceTimeView.text = onceTimeScope[0] + onceTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(onceTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + onceTimeView.text = onceTimeScope[position] + //单次时长 + CommandManager.sendTuyaDp( + deviceInstance, "112".createCommand(onceTimeScope[position]) + ) + } + }) + .build().show() + } + + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + tempDiffView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + //温度设置 + CommandManager.sendTuyaDp( + deviceInstance, "113".createCommand(minTemp + progress) + ) + } + }) + + keepTempTimeView.text = keepTempTimeScope[1] + keepTempTimeLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(keepTempTimeScope) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + keepTempTimeView.text = keepTempTimeScope[position] + //保温时长 + if (keepTempTimeScope[position] == "0min") { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand("danci") + ) + } else { + CommandManager.sendTuyaDp( + deviceInstance, "114".createCommand(keepTempTimeScope[position]) + ) + } + } + }) + .build().show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt new file mode 100644 index 0000000..3d4287d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterheater/TimeConfigActivity.kt @@ -0,0 +1,78 @@ +package com.casic.br.view.device.waterheater + +import android.content.Intent +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_time_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class TimeConfigActivity : KotlinBaseActivity() { + + private val kTag = "TimeConfigActivity" + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_time_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "预约时间设定" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d(kTag, "onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "16" -> { + + } + } + } + } + }) + } + + private val timeConfigLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == RESULT_OK) { + val data = result.data!! + val selectedTime = data.getStringExtra("selectedTime") + val selectedTemp = data.getStringExtra("selectedTemp") + + timeConfigView.text = selectedTime + tempConfigView.text = String.format("水温:$selectedTemp") + } + } + + override fun initEvent() { + timeConfigLayout.setOnClickListener { + timeConfigLauncher.launch(Intent(this, AddTimeConfigActivity::class.java)) + } + + timeConfigSwitch.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "16".createCommand("")) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..b443e3e --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/layout/activity_add_time_config.xml b/app/src/main/res/layout/activity_add_time_config.xml new file mode 100644 index 0000000..cac2610 --- /dev/null +++ b/app/src/main/res/layout/activity_add_time_config.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_once_config.xml b/app/src/main/res/layout/activity_once_config.xml new file mode 100644 index 0000000..49a370e --- /dev/null +++ b/app/src/main/res/layout/activity_once_config.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_time_config.xml b/app/src/main/res/layout/activity_time_config.xml new file mode 100644 index 0000000..1accacb --- /dev/null +++ b/app/src/main/res/layout/activity_time_config.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + \ 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 index e424c45..f9d5ecc 100644 --- a/app/src/main/res/layout/fragment_device_rangehood_control.xml +++ b/app/src/main/res/layout/fragment_device_rangehood_control.xml @@ -315,10 +315,7 @@ android:textColor="@color/hintTextColor" android:textSize="@dimen/sp_14" /> - + + + + + + + + + \ No newline at end of file