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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index f7dc307..56710f5 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -134,6 +134,22 @@ Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") } }) + +// TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : +// ITuyaGetHomeListCallback { +// override fun onSuccess(homeBeans: List) { +// registerWithoutTuya( +// userPhone, +// userPassword, +// aMapLocation, +// homeBeans[0].homeId.toString() +// ) +// } +// +// override fun onError(errorCode: String, error: String) { +// +// } +// }) } }) } @@ -192,6 +208,43 @@ }) } + private fun registerWithoutTuya( + userPhone: String, + userPassword: String, + aMapLocation: AMapLocation, + homeId: String + ) { + authenticateViewModel.obtainPublicKey() + authenticateViewModel.keyModel.observe(this@RegisterActivity, { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + + val clientId = SaveKeyValues.getValue( + LocaleConstant.PUSH_CLIENT_ID, "" + ) as String + userViewModel.register( + userPhone, + dataByPublicKey, + aMapLocation.longitude, + aMapLocation.latitude, + clientId, + aMapLocation.province, + homeId + ) + userViewModel.registerResult.observe(this@RegisterActivity, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + }) + } + }) + } + override fun observeRequestState() { userViewModel.loadState.observe(this, { LoadingDialogHub.dismiss() 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index f7dc307..56710f5 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -134,6 +134,22 @@ Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") } }) + +// TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : +// ITuyaGetHomeListCallback { +// override fun onSuccess(homeBeans: List) { +// registerWithoutTuya( +// userPhone, +// userPassword, +// aMapLocation, +// homeBeans[0].homeId.toString() +// ) +// } +// +// override fun onError(errorCode: String, error: String) { +// +// } +// }) } }) } @@ -192,6 +208,43 @@ }) } + private fun registerWithoutTuya( + userPhone: String, + userPassword: String, + aMapLocation: AMapLocation, + homeId: String + ) { + authenticateViewModel.obtainPublicKey() + authenticateViewModel.keyModel.observe(this@RegisterActivity, { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + + val clientId = SaveKeyValues.getValue( + LocaleConstant.PUSH_CLIENT_ID, "" + ) as String + userViewModel.register( + userPhone, + dataByPublicKey, + aMapLocation.longitude, + aMapLocation.latitude, + clientId, + aMapLocation.province, + homeId + ) + userViewModel.registerResult.observe(this@RegisterActivity, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + }) + } + }) + } + override fun observeRequestState() { userViewModel.loadState.observe(this, { LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt index e1be1b1..cd0a7ac 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.KeyEvent import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -94,7 +97,7 @@ } override fun onError(errorCode: String?, errorMessage: String?) { - + Log.e(kTag, "startLeScan onError: $errorMessage") } }) } @@ -130,46 +133,69 @@ override fun initEvent() { nextStepButton.setOnClickListener { - LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance() - .getActivatorToken(homeId, object : ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId - multiModeActivatorBean.deviceType = deviceBean!!.deviceType - multiModeActivatorBean.uuid = deviceBean!!.uuid - multiModeActivatorBean.address = deviceBean!!.address - multiModeActivatorBean.mac = deviceBean!!.mac - multiModeActivatorBean.ssid = params[0] - multiModeActivatorBean.pwd = params[1] - multiModeActivatorBean.token = token - multiModeActivatorBean.timeout = 120000 - - // 开始配网 - TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( - multiModeActivatorBean, - object : IMultiModeActivatorListener { - override fun onSuccess(deviceBean: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(deviceBean!!, userModel) - } - - override fun onFailure(code: Int, msg: String?, handle: Any?) { - Log.d(kTag, "errorMsg: $msg") - "添加设备失败".show(context) - LoadingDialogHub.dismiss() - } - }) - } - - override fun onFailure(errorCode: String?, errorMsg: String?) { - "获取设备配网Token失败,无法配网".show(context) + Log.d(kTag, "homeId: $homeId") + if (deviceBean == null) { + "正在扫描设备,请稍后".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(homeId, object : ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + deviceBean!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onFailure( + code: Int, + msg: String?, + handle: Any? + ) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index f7dc307..56710f5 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -134,6 +134,22 @@ Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") } }) + +// TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : +// ITuyaGetHomeListCallback { +// override fun onSuccess(homeBeans: List) { +// registerWithoutTuya( +// userPhone, +// userPassword, +// aMapLocation, +// homeBeans[0].homeId.toString() +// ) +// } +// +// override fun onError(errorCode: String, error: String) { +// +// } +// }) } }) } @@ -192,6 +208,43 @@ }) } + private fun registerWithoutTuya( + userPhone: String, + userPassword: String, + aMapLocation: AMapLocation, + homeId: String + ) { + authenticateViewModel.obtainPublicKey() + authenticateViewModel.keyModel.observe(this@RegisterActivity, { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + + val clientId = SaveKeyValues.getValue( + LocaleConstant.PUSH_CLIENT_ID, "" + ) as String + userViewModel.register( + userPhone, + dataByPublicKey, + aMapLocation.longitude, + aMapLocation.latitude, + clientId, + aMapLocation.province, + homeId + ) + userViewModel.registerResult.observe(this@RegisterActivity, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + }) + } + }) + } + override fun observeRequestState() { userViewModel.loadState.observe(this, { LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt index e1be1b1..cd0a7ac 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.KeyEvent import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -94,7 +97,7 @@ } override fun onError(errorCode: String?, errorMessage: String?) { - + Log.e(kTag, "startLeScan onError: $errorMessage") } }) } @@ -130,46 +133,69 @@ override fun initEvent() { nextStepButton.setOnClickListener { - LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance() - .getActivatorToken(homeId, object : ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId - multiModeActivatorBean.deviceType = deviceBean!!.deviceType - multiModeActivatorBean.uuid = deviceBean!!.uuid - multiModeActivatorBean.address = deviceBean!!.address - multiModeActivatorBean.mac = deviceBean!!.mac - multiModeActivatorBean.ssid = params[0] - multiModeActivatorBean.pwd = params[1] - multiModeActivatorBean.token = token - multiModeActivatorBean.timeout = 120000 - - // 开始配网 - TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( - multiModeActivatorBean, - object : IMultiModeActivatorListener { - override fun onSuccess(deviceBean: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(deviceBean!!, userModel) - } - - override fun onFailure(code: Int, msg: String?, handle: Any?) { - Log.d(kTag, "errorMsg: $msg") - "添加设备失败".show(context) - LoadingDialogHub.dismiss() - } - }) - } - - override fun onFailure(errorCode: String?, errorMsg: String?) { - "获取设备配网Token失败,无法配网".show(context) + Log.d(kTag, "homeId: $homeId") + if (deviceBean == null) { + "正在扫描设备,请稍后".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(homeId, object : ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + deviceBean!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onFailure( + code: Int, + msg: String?, + handle: Any? + ) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt index d3ee472..7da9fdb 100644 --- a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt @@ -6,12 +6,15 @@ import android.view.KeyEvent import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -44,6 +47,7 @@ private lateinit var subDevActivator: ITuyaActivator private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deviceBean: DeviceBean + private lateinit var location: AMapLocation override fun initLayoutView(): Int = R.layout.activity_scan_zigbee @@ -87,38 +91,48 @@ deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] weakReferenceHandler = WeakReferenceHandler(callback) - val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) - .setListener(object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "onError: $errorMsg") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) + LoadingDialogHub.dismiss() + return } + location = aMapLocation + val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) + .setListener(object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "onError: $errorMsg") + } - override fun onActiveSuccess(devResp: DeviceBean?) { - if (devResp == null) { - Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") - return - } - deviceBean = devResp - tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") - logoViewLayout.visibility = View.VISIBLE - Glide.with(this@ScanZigbeeActivity) - .load(deviceBean.iconUrl) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(deviceLogoView) - deviceNameView.text = String.format("产品名称:${deviceBean.name}") + override fun onActiveSuccess(devResp: DeviceBean?) { + if (devResp == null) { + Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") + return + } + deviceBean = devResp + tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") + logoViewLayout.visibility = View.VISIBLE + Glide.with(this@ScanZigbeeActivity) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + deviceNameView.text = String.format("产品名称:${deviceBean.name}") - //将绑定的设备存入自己的数据库 - weakReferenceHandler.sendEmptyMessage(2022101902) - } + //将绑定的设备存入自己的数据库 + weakReferenceHandler.sendEmptyMessage(2022101902) + } - override fun onStep(step: String?, data: Any?) { + override fun onStep(step: String?, data: Any?) { - } - }) - - subDevActivator = TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) - subDevActivator.start() + } + }) + subDevActivator = + TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) + subDevActivator.start() + } + }) } private val callback = Handler.Callback { @@ -130,7 +144,12 @@ } override fun onFinish() { - deviceViewModel.addDevice(deviceBean, DeserializeModel.getUserModel()!!) + deviceViewModel.addDevice( + deviceBean, + DeserializeModel.getUserModel()!!, + "1", + location + ) } }.start() } 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index f7dc307..56710f5 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -134,6 +134,22 @@ Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") } }) + +// TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : +// ITuyaGetHomeListCallback { +// override fun onSuccess(homeBeans: List) { +// registerWithoutTuya( +// userPhone, +// userPassword, +// aMapLocation, +// homeBeans[0].homeId.toString() +// ) +// } +// +// override fun onError(errorCode: String, error: String) { +// +// } +// }) } }) } @@ -192,6 +208,43 @@ }) } + private fun registerWithoutTuya( + userPhone: String, + userPassword: String, + aMapLocation: AMapLocation, + homeId: String + ) { + authenticateViewModel.obtainPublicKey() + authenticateViewModel.keyModel.observe(this@RegisterActivity, { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + + val clientId = SaveKeyValues.getValue( + LocaleConstant.PUSH_CLIENT_ID, "" + ) as String + userViewModel.register( + userPhone, + dataByPublicKey, + aMapLocation.longitude, + aMapLocation.latitude, + clientId, + aMapLocation.province, + homeId + ) + userViewModel.registerResult.observe(this@RegisterActivity, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + }) + } + }) + } + override fun observeRequestState() { userViewModel.loadState.observe(this, { LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt index e1be1b1..cd0a7ac 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.KeyEvent import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -94,7 +97,7 @@ } override fun onError(errorCode: String?, errorMessage: String?) { - + Log.e(kTag, "startLeScan onError: $errorMessage") } }) } @@ -130,46 +133,69 @@ override fun initEvent() { nextStepButton.setOnClickListener { - LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance() - .getActivatorToken(homeId, object : ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId - multiModeActivatorBean.deviceType = deviceBean!!.deviceType - multiModeActivatorBean.uuid = deviceBean!!.uuid - multiModeActivatorBean.address = deviceBean!!.address - multiModeActivatorBean.mac = deviceBean!!.mac - multiModeActivatorBean.ssid = params[0] - multiModeActivatorBean.pwd = params[1] - multiModeActivatorBean.token = token - multiModeActivatorBean.timeout = 120000 - - // 开始配网 - TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( - multiModeActivatorBean, - object : IMultiModeActivatorListener { - override fun onSuccess(deviceBean: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(deviceBean!!, userModel) - } - - override fun onFailure(code: Int, msg: String?, handle: Any?) { - Log.d(kTag, "errorMsg: $msg") - "添加设备失败".show(context) - LoadingDialogHub.dismiss() - } - }) - } - - override fun onFailure(errorCode: String?, errorMsg: String?) { - "获取设备配网Token失败,无法配网".show(context) + Log.d(kTag, "homeId: $homeId") + if (deviceBean == null) { + "正在扫描设备,请稍后".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(homeId, object : ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + deviceBean!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onFailure( + code: Int, + msg: String?, + handle: Any? + ) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt index d3ee472..7da9fdb 100644 --- a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt @@ -6,12 +6,15 @@ import android.view.KeyEvent import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -44,6 +47,7 @@ private lateinit var subDevActivator: ITuyaActivator private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deviceBean: DeviceBean + private lateinit var location: AMapLocation override fun initLayoutView(): Int = R.layout.activity_scan_zigbee @@ -87,38 +91,48 @@ deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] weakReferenceHandler = WeakReferenceHandler(callback) - val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) - .setListener(object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "onError: $errorMsg") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) + LoadingDialogHub.dismiss() + return } + location = aMapLocation + val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) + .setListener(object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "onError: $errorMsg") + } - override fun onActiveSuccess(devResp: DeviceBean?) { - if (devResp == null) { - Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") - return - } - deviceBean = devResp - tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") - logoViewLayout.visibility = View.VISIBLE - Glide.with(this@ScanZigbeeActivity) - .load(deviceBean.iconUrl) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(deviceLogoView) - deviceNameView.text = String.format("产品名称:${deviceBean.name}") + override fun onActiveSuccess(devResp: DeviceBean?) { + if (devResp == null) { + Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") + return + } + deviceBean = devResp + tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") + logoViewLayout.visibility = View.VISIBLE + Glide.with(this@ScanZigbeeActivity) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + deviceNameView.text = String.format("产品名称:${deviceBean.name}") - //将绑定的设备存入自己的数据库 - weakReferenceHandler.sendEmptyMessage(2022101902) - } + //将绑定的设备存入自己的数据库 + weakReferenceHandler.sendEmptyMessage(2022101902) + } - override fun onStep(step: String?, data: Any?) { + override fun onStep(step: String?, data: Any?) { - } - }) - - subDevActivator = TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) - subDevActivator.start() + } + }) + subDevActivator = + TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) + subDevActivator.start() + } + }) } private val callback = Handler.Callback { @@ -130,7 +144,12 @@ } override fun onFinish() { - deviceViewModel.addDevice(deviceBean, DeserializeModel.getUserModel()!!) + deviceViewModel.addDevice( + deviceBean, + DeserializeModel.getUserModel()!!, + "1", + location + ) } }.start() } 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 4d22582..d3968d3 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 @@ -14,7 +14,6 @@ import com.casic.br.fragment.cooker.ControlPageFragment import com.casic.br.fragment.cooker.ServicePageFragment import com.casic.br.fragment.cooker.StatusPageFragment -import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant import com.casic.br.utils.TuyaDeviceListener import com.google.android.material.tabs.TabLayout @@ -178,12 +177,6 @@ }) } - override fun onResume() { - super.onResume() - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - private fun updateVersion() { AlertControlDialog.Builder() .setContext(this) 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 c883156..38212ce 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -116,7 +116,7 @@ return when (this) { "yyj" -> "智能油烟机" "rs" -> "智能热水器" - "rqz" -> "智能燃气灶" + "rq" -> "智能燃气灶" "bgl" -> "智能壁挂炉" "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" 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 cf0ef3d..58f9e46 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -49,10 +49,15 @@ weakReferenceHandler = WeakReferenceHandler(callback) //TODO 热门推荐 + val imageArray = arrayOf( + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01zwi8SS1NI76hAXxOh_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i1/810471546/O1CN01dBqH051NI76dqVg8e_!!810471546.jpg", + "https://img.alicdn.com/imgextra/i4/810471546/O1CN01NJ4Xh81NI76ZuU7lh_!!810471546.jpg" + ) val recommendModels = ArrayList() for (i in 0..2) { val model = RecommendModel() - model.imageLink = "https://img95.699pic.com/photo/40006/1412.jpg_wh860.jpg" + model.imageLink = imageArray[i] recommendModels.add(model) } @@ -136,7 +141,7 @@ //壁挂炉 requireContext().navigatePageTo(deviceModel.devId) } - selectedCategory.contains("rqz") -> { + selectedCategory.contains("rq") -> { //燃气灶 requireContext().navigatePageTo(deviceModel.devId) } 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 aba0152..9af5218 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 @@ -61,23 +61,56 @@ 2022092901 -> { val parseObject = JSONObject.parseObject(message.obj as String) parseObject.keys.forEach { + var leftWork = false + var rightWork = false when (it) { - "104" -> { - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + "1" -> { + //soft, low, medium, high, close + leftWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) } - "3" -> { - + "2" -> { + rightWork = (parseObject[it] as String) != "close" + setTurnOffRadioButton(leftWork, rightWork) + } + "3" -> {//定时 + leftCookerCurrentProgress = parseObject[it] as Int + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + } + "5" -> {//倒计时 + leftDelayTimeView.text = String.format("${parseObject[it]}min") } "4" -> { - + rightCookerCurrentProgress = parseObject[it] as Int + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") } - "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 + "6" -> { + rightDelayTimeView.text = String.format("${parseObject[it]}min") + } + "102" -> { + leftSwitch.isChecked = parseObject[it] as Boolean + if (!leftSwitch.isChecked) { + leftCookerCurrentProgress = 0 + leftCookerTimeSlider.currentProgress = leftCookerCurrentProgress + leftCookerTimeView.text = + String.format("${minTime + leftCookerCurrentProgress}") + leftDelayTimeView.text = "--" + } + } + "103" -> { + rightSwitch.isChecked = parseObject[it] as Boolean + if (!rightSwitch.isChecked) { + rightCookerCurrentProgress = 0 + rightCookerTimeSlider.currentProgress = rightCookerCurrentProgress + rightCookerTimeView.text = + String.format("${minTime + rightCookerCurrentProgress}") + rightDelayTimeView.text = "--" + } + } } } } @@ -85,12 +118,18 @@ true } + private fun setTurnOffRadioButton(left: Boolean, right: Boolean) { + turnOffRadioButton.isChecked = !(!left && !right) + isDeviceWorking = turnOffRadioButton.isChecked + } + override fun initEvent() { turnOffRadioButton.setOnClickListener { if (isDeviceWorking) { CommandManager.sendTuyaDp(deviceInstance, "104".createCommand(true)) } else { - "燃气灶无法一键开火,请手动打开燃气灶".show(requireContext()) + turnOffRadioButton.isChecked = false + "燃气灶无法自动点火,请手动点火".show(requireContext()) } } @@ -124,21 +163,11 @@ } }) - leftSwitch.setOnCheckedChangeListener { view, isChecked -> - if (leftCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + leftSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) } - rightSwitch.setOnCheckedChangeListener { view, isChecked -> - if (rightCookerCurrentProgress == 0) { - view.isChecked = false - "未设置定时,无法打开此开关".show(requireContext()) - return@setOnCheckedChangeListener - } + rightSwitch.setOnCheckedChangeListener { _, isChecked -> CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(isChecked)) } } diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 9a0d747..4d105c3 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import com.casic.br.extensions.toChineseTypeName import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant @@ -218,27 +219,28 @@ suspend fun uploadImage(image: File): String { val requestBody = image.asRequestBody("image/jpeg".toMediaTypeOrNull()) val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) - return api.uploadImage(AuthenticationHelper.token!!,imagePart) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) } /** * 添加设备到自己服务器 */ - suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { + suspend fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, deviceAddress: String + ): String { val paramObject = JSONObject() paramObject.put("deviceId", devResp.devId) + paramObject.put("iotDevice", iotDevice) + paramObject.put("deviceAddress", deviceAddress) paramObject.put("productCode", devResp.productId) paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) - val deviceName = when (devResp.productStandardConfig.category) { - "yyj" -> "油烟机" - "rs" -> "热水器" - "bgl" -> "壁挂炉" - else -> "燃气灶" - } - paramObject.put("deviceName", deviceName) + paramObject.put("deviceBindUser", 1) + paramObject.put("deviceName", devResp.toChineseTypeName()) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) paramObject.put("deviceMac", devResp.mac) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index 8a2c6c8..6e383ba 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -52,42 +55,61 @@ } LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ConnectDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ConnectDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!, userModel) - } - - override fun onStep(step: String?, data: Any?) { - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(DeserializeModel.getHomeId(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError( + errorCode: String?, + errorMsg: String? + ) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + devResp!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder) + .start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + }) } } 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 0c977fd..0d0934d 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,24 +1,35 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.viewpager.widget.ViewPager +import com.amap.api.location.AMapLocation import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.LocationHelper import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson 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.ITuyaGetHomeListCallback +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 @@ -47,7 +58,8 @@ } override fun observeRequestState() { - +// createHome() +// dismissHome() } override fun initEvent() { @@ -110,4 +122,58 @@ } } else super.onKeyDown(keyCode, event) } + + private fun dismissHome() { + TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : ITuyaGetHomeListCallback { + override fun onSuccess(homeBeans: List) { + Log.d(kTag, homeBeans.toJson()) +// homeBeans.forEach { +// Log.d(kTag, it.toJson()) +// TuyaHomeSdk.newHomeInstance(it.homeId) +// .dismissHome(object : com.tuya.smart.sdk.api.IResultCallback { +// override fun onError(code: String?, error: String?) { +// +// } +// +// override fun onSuccess() { +// Log.d(kTag, it.homeId.toString()) +// } +// }) +// } + } + + override fun onError(errorCode: String, error: String) { + + } + }) + } + + private fun createHome() { + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + /** + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + if (aMapLocation == null) { + "信号弱,创建家庭失败".show(this@MainActivity) + LoadingDialogHub.dismiss() + return + } + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getHomeManagerInstance().createHome( + "${userModel.phone}的家", aMapLocation.longitude, aMapLocation.latitude, + aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + Log.d(kTag, "homeId: ${bean!!.homeId}") + } + + 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/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index f7dc307..56710f5 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -134,6 +134,22 @@ Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") } }) + +// TuyaHomeSdk.getHomeManagerInstance().queryHomeList(object : +// ITuyaGetHomeListCallback { +// override fun onSuccess(homeBeans: List) { +// registerWithoutTuya( +// userPhone, +// userPassword, +// aMapLocation, +// homeBeans[0].homeId.toString() +// ) +// } +// +// override fun onError(errorCode: String, error: String) { +// +// } +// }) } }) } @@ -192,6 +208,43 @@ }) } + private fun registerWithoutTuya( + userPhone: String, + userPassword: String, + aMapLocation: AMapLocation, + homeId: String + ) { + authenticateViewModel.obtainPublicKey() + authenticateViewModel.keyModel.observe(this@RegisterActivity, { keyModel -> + if (keyModel.code == 200) { + val keyString = keyModel.data!!.publicKey!! + val publicKey = RSAUtils.keyStrToPublicKey(keyString) + val dataByPublicKey = RSAUtils.encryptDataByPublicKey( + userPassword.toByteArray(), publicKey!! + ) + + val clientId = SaveKeyValues.getValue( + LocaleConstant.PUSH_CLIENT_ID, "" + ) as String + userViewModel.register( + userPhone, + dataByPublicKey, + aMapLocation.longitude, + aMapLocation.latitude, + clientId, + aMapLocation.province, + homeId + ) + userViewModel.registerResult.observe(this@RegisterActivity, { + if (it.code == 200) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + }) + } + }) + } + override fun observeRequestState() { userViewModel.loadState.observe(this, { LoadingDialogHub.dismiss() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt index e1be1b1..cd0a7ac 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -3,10 +3,13 @@ import android.util.Log import android.view.KeyEvent import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -94,7 +97,7 @@ } override fun onError(errorCode: String?, errorMessage: String?) { - + Log.e(kTag, "startLeScan onError: $errorMessage") } }) } @@ -130,46 +133,69 @@ override fun initEvent() { nextStepButton.setOnClickListener { - LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance() - .getActivatorToken(homeId, object : ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId - multiModeActivatorBean.deviceType = deviceBean!!.deviceType - multiModeActivatorBean.uuid = deviceBean!!.uuid - multiModeActivatorBean.address = deviceBean!!.address - multiModeActivatorBean.mac = deviceBean!!.mac - multiModeActivatorBean.ssid = params[0] - multiModeActivatorBean.pwd = params[1] - multiModeActivatorBean.token = token - multiModeActivatorBean.timeout = 120000 - - // 开始配网 - TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( - multiModeActivatorBean, - object : IMultiModeActivatorListener { - override fun onSuccess(deviceBean: DeviceBean?) { - //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(deviceBean!!, userModel) - } - - override fun onFailure(code: Int, msg: String?, handle: Any?) { - Log.d(kTag, "errorMsg: $msg") - "添加设备失败".show(context) - LoadingDialogHub.dismiss() - } - }) - } - - override fun onFailure(errorCode: String?, errorMsg: String?) { - "获取设备配网Token失败,无法配网".show(context) + Log.d(kTag, "homeId: $homeId") + if (deviceBean == null) { + "正在扫描设备,请稍后".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) LoadingDialogHub.dismiss() + return } - }) + TuyaHomeSdk.getActivatorInstance() + .getActivatorToken(homeId, object : ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice( + deviceBean!!, + userModel, + "1", + aMapLocation + ) + } + + override fun onFailure( + code: Int, + msg: String?, + handle: Any? + ) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt index d3ee472..7da9fdb 100644 --- a/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanZigbeeActivity.kt @@ -6,12 +6,15 @@ import android.view.KeyEvent import android.view.View import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.br.R +import com.casic.br.base.BaseApplication import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocationHelper import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -44,6 +47,7 @@ private lateinit var subDevActivator: ITuyaActivator private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var deviceBean: DeviceBean + private lateinit var location: AMapLocation override fun initLayoutView(): Int = R.layout.activity_scan_zigbee @@ -87,38 +91,48 @@ deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] weakReferenceHandler = WeakReferenceHandler(callback) - val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) - .setListener(object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "onError: $errorMsg") + LocationHelper.obtainCurrentLocation(this, object : LocationHelper.ILocationListener { + override fun onAMapLocationGet(aMapLocation: AMapLocation?) { + if (aMapLocation == null) { + "信号弱,添加设备失败".show(BaseApplication.obtainInstance()) + LoadingDialogHub.dismiss() + return } + location = aMapLocation + val configBuilder = TuyaGwSubDevActivatorBuilder().setDevId(deviceId) + .setListener(object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "onError: $errorMsg") + } - override fun onActiveSuccess(devResp: DeviceBean?) { - if (devResp == null) { - Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") - return - } - deviceBean = devResp - tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") - logoViewLayout.visibility = View.VISIBLE - Glide.with(this@ScanZigbeeActivity) - .load(deviceBean.iconUrl) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(deviceLogoView) - deviceNameView.text = String.format("产品名称:${deviceBean.name}") + override fun onActiveSuccess(devResp: DeviceBean?) { + if (devResp == null) { + Log.e(kTag, "onActiveSuccess: 无法扫描到涂鸦Zigbee模组") + return + } + deviceBean = devResp + tipsView.text = String.format("已搜索到Zigbee设备,基本信息如下") + logoViewLayout.visibility = View.VISIBLE + Glide.with(this@ScanZigbeeActivity) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + deviceNameView.text = String.format("产品名称:${deviceBean.name}") - //将绑定的设备存入自己的数据库 - weakReferenceHandler.sendEmptyMessage(2022101902) - } + //将绑定的设备存入自己的数据库 + weakReferenceHandler.sendEmptyMessage(2022101902) + } - override fun onStep(step: String?, data: Any?) { + override fun onStep(step: String?, data: Any?) { - } - }) - - subDevActivator = TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) - subDevActivator.start() + } + }) + subDevActivator = + TuyaHomeSdk.getActivatorInstance().newGwSubDevActivator(configBuilder) + subDevActivator.start() + } + }) } private val callback = Handler.Callback { @@ -130,7 +144,12 @@ } override fun onFinish() { - deviceViewModel.addDevice(deviceBean, DeserializeModel.getUserModel()!!) + deviceViewModel.addDevice( + deviceBean, + DeserializeModel.getUserModel()!!, + "1", + location + ) } }.start() } 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 4d22582..d3968d3 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 @@ -14,7 +14,6 @@ import com.casic.br.fragment.cooker.ControlPageFragment import com.casic.br.fragment.cooker.ServicePageFragment import com.casic.br.fragment.cooker.StatusPageFragment -import com.casic.br.utils.CommandManager import com.casic.br.utils.LocaleConstant import com.casic.br.utils.TuyaDeviceListener import com.google.android.material.tabs.TabLayout @@ -178,12 +177,6 @@ }) } - override fun onResume() { - super.onResume() - //每次获取焦点都查询设备的开关机状态 - CommandManager.getTuyaDp(deviceInstance, "1") - } - private fun updateVersion() { AlertControlDialog.Builder() .setContext(this) diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 241ce48..7c54704 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,5 +1,6 @@ package com.casic.br.vm +import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage @@ -13,8 +14,14 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { - fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel) = launch({ - val response = RetrofitServiceManager.addDevice(devResp, userModel) + fun addDevice( + devResp: DeviceBean, + userModel: UserDetailModel.DataModel, + iotDevice: String, + aMapLocation: AMapLocation + ) = launch({ + val response = + RetrofitServiceManager.addDevice(devResp, userModel, iotDevice, aMapLocation.province) val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success