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