diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt index 79598a9..8428daa 100644 --- a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt @@ -65,7 +65,7 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt index 79598a9..8428daa 100644 --- a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt @@ -65,7 +65,7 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index d8b5de5..e9a4533 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -1,6 +1,7 @@ @@ -22,7 +23,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:fontFamily="sans-serif-medium" android:text="一键关火" android:textColor="@color/black" android:textSize="@dimen/sp_14" /> @@ -35,5 +35,288 @@ android:button="@null" android:gravity="center" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 46ceda0..51ef974 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,4 +115,6 @@ implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:4.1.8' //图表 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + //高德地图 + implementation 'com.amap.api:location:5.3.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 907b123..dd3436b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -78,5 +78,12 @@ android:name="TUYA_SMART_SECRET" android:value="f3k4ah5qxcfmhm5fhgpvfjje4adgh8at" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt index 79598a9..8428daa 100644 --- a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt @@ -65,7 +65,7 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index d8b5de5..e9a4533 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -1,6 +1,7 @@ @@ -22,7 +23,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:fontFamily="sans-serif-medium" android:text="一键关火" android:textColor="@color/black" android:textSize="@dimen/sp_14" /> @@ -35,5 +35,288 @@ android:button="@null" android:gravity="center" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_status.xml b/app/src/main/res/layout/fragment_device_cooker_status.xml index d289627..92b6b8e 100644 --- a/app/src/main/res/layout/fragment_device_cooker_status.xml +++ b/app/src/main/res/layout/fragment_device_cooker_status.xml @@ -111,7 +111,7 @@ android:textSize="@dimen/sp_14" /> - + android:orientation="vertical"> - + + + + + + android:enabled="false" + android:thumb="@drawable/select_switch_circle" + android:track="@drawable/select_switch_background" + tools:ignore="UseSwitchCompatOrMaterialXml" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt index 79598a9..8428daa 100644 --- a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt @@ -65,7 +65,7 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index d8b5de5..e9a4533 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -1,6 +1,7 @@ @@ -22,7 +23,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:fontFamily="sans-serif-medium" android:text="一键关火" android:textColor="@color/black" android:textSize="@dimen/sp_14" /> @@ -35,5 +35,288 @@ android:button="@null" android:gravity="center" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_status.xml b/app/src/main/res/layout/fragment_device_cooker_status.xml index d289627..92b6b8e 100644 --- a/app/src/main/res/layout/fragment_device_cooker_status.xml +++ b/app/src/main/res/layout/fragment_device_cooker_status.xml @@ -111,7 +111,7 @@ android:textSize="@dimen/sp_14" /> - + android:orientation="vertical"> - + + + + + + android:enabled="false" + android:thumb="@drawable/select_switch_circle" + android:track="@drawable/select_switch_background" + tools:ignore="UseSwitchCompatOrMaterialXml" /> + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt index c374978..766c0d7 100644 --- a/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt +++ b/app/src/main/java/com/casic/br/callback/OnImageCompressListener.kt @@ -1,4 +1,4 @@ -package com.casic.smarttube.callback +package com.casic.br.callback import java.io.File diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index bd2b798..cda5da7 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,14 +2,13 @@ import android.content.Context import android.util.Log -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.toJson import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException -import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index ec7a9cd..db3ffae 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -106,17 +106,6 @@ deviceModels.add(model) } - //TODO 测试 -// val model = AddedDeviceModel() -// model.deviceId = "" -// model.deviceName = "万家乐热水器" -// model.isOnline = false -// model.deviceImage = "" -// model.deviceModel = "" -// model.deviceType = "" -// model.deviceUsedTime = "已使用0天" -// deviceModels.add(model) - when { isRefresh -> { dataBeans.clear() @@ -160,10 +149,10 @@ requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } } } diff --git a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt index ba4f9e6..aba0152 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/ControlPageFragment.kt @@ -1,18 +1,32 @@ package com.casic.br.fragment.cooker +import android.os.Handler +import com.alibaba.fastjson.JSONObject import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.qmuiteam.qmui.widget.QMUISlider import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.fragment_device_cooker_control.* +import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { + +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler } private val kTag = "ControlPageFragment" + private var isDeviceWorking = false + private val minTime = 0 + private var maxTime = 180 + private var leftCookerCurrentProgress = 0 + private var rightCookerCurrentProgress = 0 override fun initLayoutView(): Int = R.layout.fragment_device_cooker_control @@ -25,10 +39,107 @@ } override fun initData() { + weakReference = WeakReferenceHandler(callback) + //左 + leftCookerTimeSlider.tickCount = abs(maxTime - minTime) + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = String.format("${minTime + leftCookerCurrentProgress}") + leftCookerMinTimeView.text = minTime.toString() + leftCookerMaxTimeView.text = maxTime.toString() + + //右 + rightCookerTimeSlider.tickCount = abs(maxTime - minTime) + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = String.format("${minTime + rightCookerCurrentProgress}") + rightCookerMinTimeView.text = minTime.toString() + rightCookerMaxTimeView.text = maxTime.toString() + } + + private val callback = Handler.Callback { message -> + when (message.what) { + 2022092901 -> { + val parseObject = JSONObject.parseObject(message.obj as String) + parseObject.keys.forEach { + when (it) { + "104" -> { + isDeviceWorking = parseObject[it] as Boolean + turnOffRadioButton.isChecked = isDeviceWorking + } + "3" -> { + + } + "4" -> { + + } + "5" -> leftDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "6" -> rightDelayTimeView.text = + String.format("${parseObject[it] as String}min") + "102" -> leftSwitch.isChecked = parseObject[it] as Boolean + "103" -> rightSwitch.isChecked = parseObject[it] as Boolean + } + } + } + } + true } override fun initEvent() { + turnOffRadioButton.setOnClickListener { + if (isDeviceWorking) { + CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) + } else { + "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + } + } + leftCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + leftCookerCurrentProgress = progress + leftCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTime + progress) + ) + } + }) + + rightCookerTimeSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + rightCookerCurrentProgress = progress + rightCookerTimeView.text = String.format("${minTime + progress}") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "4".createCommand(minTime + progress) + ) + } + }) + + leftSwitch.setOnCheckedChangeListener { view, isChecked -> + if (leftCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) + } + + rightSwitch.setOnCheckedChangeListener { view, isChecked -> + if (rightCookerCurrentProgress == 0) { + view.isChecked = false + "未设置定时,无法打开此开关".show(requireContext()) + return@setOnCheckedChangeListener + } + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 4689a8a..55600ee 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -21,7 +21,6 @@ private val kTag = "StatusPageFragment" private val wifi by lazy { requireContext().applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_cooker_status @@ -39,12 +38,33 @@ private val callback = Handler.Callback { message -> when (message.what) { - 2022092802 -> { + 2022092902 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { when (it) { - "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean + "1" -> {//soft, low, medium, high + leftCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "2" -> {//soft, low, medium, high + rightCookerStateView.text = when (parseObject[it] as String) { + "soft" -> "保温" + "low" -> "小火" + "medium" -> "中火" + "high" -> "猛火" + else -> "已关火" + } + } + "11" -> { + workingTimeView.text = String.format("${parseObject[it] as Int}min") + } + "101" -> { + yzStatusSwitch.isChecked = parseObject[it] as Boolean } } } @@ -71,11 +91,6 @@ } else { wifiLayout.visibility = View.GONE } -// deviceStateView.text = if (!isDeviceWorking) { -// "已关机" -// } else { -// "工作中" -// } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt index c472dc9..e64134e 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/ControlPageFragment.kt @@ -13,8 +13,7 @@ import kotlinx.android.synthetic.main.fragment_device_fireplace_control.* import kotlin.math.abs -class ControlPageFragment(private val deviceInstance: ITuyaDevice, private val deviceId: String) : - KotlinBaseFragment() { +class ControlPageFragment(private val deviceInstance: ITuyaDevice) : KotlinBaseFragment() { companion object { lateinit var weakReference: WeakReferenceHandler diff --git a/app/src/main/java/com/casic/br/utils/LocationHelper.kt b/app/src/main/java/com/casic/br/utils/LocationHelper.kt new file mode 100644 index 0000000..c28d58a --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LocationHelper.kt @@ -0,0 +1,35 @@ +package com.casic.br.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +object LocationHelper { + private const val kTag = "LocationHelper" + + fun obtainCurrentLocation(context: Context, listener: ILocationListener) { + val locationClient = AMapLocationClient(context) + val locationOption = AMapLocationClientOption() + //设置定位模式为高精度模式,AMapLocationMode.Battery_Saving为低功耗模式,AMapLocationMode.Device_Sensors是仅设备模式 + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。 + Log.e( + kTag, "location Error, ErrCode: ${it.errorCode} , errInfo: ${it.errorInfo}" + ) + } + } + locationClient.startLocation() + } + + interface ILocationListener { + fun onAMapLocationGet(aMapLocation: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 5d4dff1..3d8536d 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,14 +2,12 @@ import android.graphics.Color import android.util.Log -import com.bumptech.glide.Glide -import com.bumptech.glide.request.RequestOptions import com.casic.br.R import com.casic.br.extensions.compressImage import com.casic.br.utils.DeserializeModel import com.casic.br.utils.GlideLoadEngine import com.casic.br.utils.LocaleConstant -import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.br.callback.OnImageCompressListener import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index cc88165..a2fb29a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -8,19 +7,13 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* -import com.casic.br.utils.LocaleConstant 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.SaveKeyValues -import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { - private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -40,27 +33,7 @@ } override fun initData() { - /** - * TODO 需要改为实际情况 - * - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - SaveKeyValues.putValue(LocaleConstant.HOME_ID, bean?.homeId.toString()) - } - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index 96510fb..59875ea 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -2,17 +2,24 @@ import android.content.Context import android.os.CountDownTimer +import android.util.Log +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.isPhoneNumber import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.tuya.smart.android.user.api.IRegisterCallback import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_register.* import kotlinx.android.synthetic.main.include_left_back_title.* @@ -95,19 +102,51 @@ } LoadingDialogHub.show(this, "注册中,请稍后") - TuyaHomeSdk.getUserInstance().registerAccountWithPhone( - "86", userPhone, userPassword, smsCode, - object : IRegisterCallback { - override fun onSuccess(user: User?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - override fun onError(code: String?, error: String?) { - LoadingDialogHub.dismiss() - "用户注册失败".show(context) + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + return } - }) + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue( + LocaleConstant.HOME_ID, bean?.homeId.toString() + ) + + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + //TODO 调用自己后台接口 + Log.d( + kTag, "onAMapLocationGet: ${aMapLocation.province}" + ) + + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt index 2d1e332..240636c 100644 --- a/app/src/main/java/com/casic/br/view/device/CookerActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/CookerActivity.kt @@ -54,18 +54,18 @@ //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) -// val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) -// if (deviceBean == null) { -// "查询设备信息失败,请检查设备是否已离线".show(this) -// return -// } -// titleView.text = "万家乐壁挂炉" -// Glide.with(this) -// .load(deviceBean.iconUrl) -// .placeholder(R.mipmap.load_image_error) -// .into(deviceLogoView) + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = "万家乐壁挂炉" + Glide.with(this) + .load(deviceBean.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) @@ -73,20 +73,20 @@ override fun onDpUpdate(devId: String?, dpStr: String?) { Log.d(kTag, "onDpUpdate: $dpStr") -// val controlMsg = ControlPageFragment.weakReference.obtainMessage() -// controlMsg.what = 2022092901 -// controlMsg.obj = dpStr -// ControlPageFragment.weakReference.sendMessage(controlMsg) -// -// val statusMsg = StatusPageFragment.weakReference.obtainMessage() -// statusMsg.what = 2022092902 -// statusMsg.obj = dpStr -// StatusPageFragment.weakReference.sendMessage(statusMsg) -// -// val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() -// deviceBeanMsg.what = 2022092903 -// deviceBeanMsg.obj = deviceBean -// StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) + val controlMsg = ControlPageFragment.weakReference.obtainMessage() + controlMsg.what = 2022092901 + controlMsg.obj = dpStr + ControlPageFragment.weakReference.sendMessage(controlMsg) + + val statusMsg = StatusPageFragment.weakReference.obtainMessage() + statusMsg.what = 2022092902 + statusMsg.obj = dpStr + StatusPageFragment.weakReference.sendMessage(statusMsg) + + val deviceBeanMsg = StatusPageFragment.weakReference.obtainMessage() + deviceBeanMsg.what = 2022092903 + deviceBeanMsg.obj = deviceBean + StatusPageFragment.weakReference.sendMessage(deviceBeanMsg) } }) } diff --git a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt index 79598a9..8428daa 100644 --- a/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/FireplaceActivity.kt @@ -65,7 +65,7 @@ .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) - fragmentPages.add(ControlPageFragment(deviceInstance, deviceId)) + fragmentPages.add(ControlPageFragment(deviceInstance)) fragmentPages.add(StatusPageFragment(deviceInstance)) fragmentPages.add(ServicePageFragment()) diff --git a/app/src/main/res/layout/fragment_device_cooker_control.xml b/app/src/main/res/layout/fragment_device_cooker_control.xml index d8b5de5..e9a4533 100644 --- a/app/src/main/res/layout/fragment_device_cooker_control.xml +++ b/app/src/main/res/layout/fragment_device_cooker_control.xml @@ -1,6 +1,7 @@ @@ -22,7 +23,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:fontFamily="sans-serif-medium" android:text="一键关火" android:textColor="@color/black" android:textSize="@dimen/sp_14" /> @@ -35,5 +35,288 @@ android:button="@null" android:gravity="center" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_cooker_status.xml b/app/src/main/res/layout/fragment_device_cooker_status.xml index d289627..92b6b8e 100644 --- a/app/src/main/res/layout/fragment_device_cooker_status.xml +++ b/app/src/main/res/layout/fragment_device_cooker_status.xml @@ -111,7 +111,7 @@ android:textSize="@dimen/sp_14" /> - + android:orientation="vertical"> - + + + + + + android:enabled="false" + android:thumb="@drawable/select_switch_circle" + android:track="@drawable/select_switch_background" + tools:ignore="UseSwitchCompatOrMaterialXml" />