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 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ 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 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ No newline at end of file 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 3480d5b..e6c37c6 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -6,6 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter +import com.casic.br.extensions.diffDate import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel import com.casic.br.model.RecommendModel @@ -89,7 +90,11 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { + + Log.d(kTag, "dps: ${it.dps}") + val model = AddedDeviceModel() + model.deviceId = it.devId when (it.deviceCategory) { "yyj" -> model.deviceName = "万家乐油烟机" } @@ -97,7 +102,7 @@ model.deviceImage = it.iconUrl model.deviceModel = it.name model.deviceType = it.deviceCategory - model.deviceUsedTime = "未知" + model.deviceUsedTime = "已使用${it.time.toString().diffDate()}天" deviceModels.add(model) } @@ -141,7 +146,7 @@ requireContext().navigatePageTo(deviceModel.deviceName) } deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { requireContext().navigatePageTo() 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 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ No newline at end of file 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 3480d5b..e6c37c6 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -6,6 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter +import com.casic.br.extensions.diffDate import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel import com.casic.br.model.RecommendModel @@ -89,7 +90,11 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { + + Log.d(kTag, "dps: ${it.dps}") + val model = AddedDeviceModel() + model.deviceId = it.devId when (it.deviceCategory) { "yyj" -> model.deviceName = "万家乐油烟机" } @@ -97,7 +102,7 @@ model.deviceImage = it.iconUrl model.deviceModel = it.name model.deviceType = it.deviceCategory - model.deviceUsedTime = "未知" + model.deviceUsedTime = "已使用${it.time.toString().diffDate()}天" deviceModels.add(model) } @@ -141,7 +146,7 @@ requireContext().navigatePageTo(deviceModel.deviceName) } deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java index d4a358b..b74bb70 100644 --- a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java +++ b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java @@ -4,6 +4,7 @@ * 已添加设备(Iot和非Iot设备)数据模型 */ public class AddedDeviceModel { + private String deviceId; private String deviceName; private boolean isOnline; private String deviceImage; @@ -11,6 +12,14 @@ private String deviceType; private String deviceUsedTime; + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getDeviceName() { return deviceName; } 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 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ No newline at end of file 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 3480d5b..e6c37c6 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -6,6 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter +import com.casic.br.extensions.diffDate import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel import com.casic.br.model.RecommendModel @@ -89,7 +90,11 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { + + Log.d(kTag, "dps: ${it.dps}") + val model = AddedDeviceModel() + model.deviceId = it.devId when (it.deviceCategory) { "yyj" -> model.deviceName = "万家乐油烟机" } @@ -97,7 +102,7 @@ model.deviceImage = it.iconUrl model.deviceModel = it.name model.deviceType = it.deviceCategory - model.deviceUsedTime = "未知" + model.deviceUsedTime = "已使用${it.time.toString().diffDate()}天" deviceModels.add(model) } @@ -141,7 +146,7 @@ requireContext().navigatePageTo(deviceModel.deviceName) } deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java index d4a358b..b74bb70 100644 --- a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java +++ b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java @@ -4,6 +4,7 @@ * 已添加设备(Iot和非Iot设备)数据模型 */ public class AddedDeviceModel { + private String deviceId; private String deviceName; private boolean isOnline; private String deviceImage; @@ -11,6 +12,14 @@ private String deviceType; private String deviceUsedTime; + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getDeviceName() { return deviceName; } diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt new file mode 100644 index 0000000..c2e436b --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -0,0 +1,33 @@ +package com.casic.br.utils + +import android.util.Log +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice + +object CommandManager { + private const val kTag = "CommandManager" + + fun getTuyaDp(deviceInstance: ITuyaDevice, dpId: String) { + deviceInstance.getDp(dpId, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } + + fun sendTuyaDp(deviceInstance: ITuyaDevice, cmd: String) { + deviceInstance.publishDps(cmd, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } +} \ 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 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ No newline at end of file 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 3480d5b..e6c37c6 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -6,6 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter +import com.casic.br.extensions.diffDate import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel import com.casic.br.model.RecommendModel @@ -89,7 +90,11 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { + + Log.d(kTag, "dps: ${it.dps}") + val model = AddedDeviceModel() + model.deviceId = it.devId when (it.deviceCategory) { "yyj" -> model.deviceName = "万家乐油烟机" } @@ -97,7 +102,7 @@ model.deviceImage = it.iconUrl model.deviceModel = it.name model.deviceType = it.deviceCategory - model.deviceUsedTime = "未知" + model.deviceUsedTime = "已使用${it.time.toString().diffDate()}天" deviceModels.add(model) } @@ -141,7 +146,7 @@ requireContext().navigatePageTo(deviceModel.deviceName) } deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java index d4a358b..b74bb70 100644 --- a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java +++ b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java @@ -4,6 +4,7 @@ * 已添加设备(Iot和非Iot设备)数据模型 */ public class AddedDeviceModel { + private String deviceId; private String deviceName; private boolean isOnline; private String deviceImage; @@ -11,6 +12,14 @@ private String deviceType; private String deviceUsedTime; + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getDeviceName() { return deviceName; } diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt new file mode 100644 index 0000000..c2e436b --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -0,0 +1,33 @@ +package com.casic.br.utils + +import android.util.Log +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice + +object CommandManager { + private const val kTag = "CommandManager" + + fun getTuyaDp(deviceInstance: ITuyaDevice, dpId: String) { + deviceInstance.getDp(dpId, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } + + fun sendTuyaDp(deviceInstance: ITuyaDevice, cmd: String) { + deviceInstance.publishDps(cmd, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index d8035fa..4b440ff 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,13 +1,38 @@ package com.casic.br.view.device +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.extensions.diffMinute +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.google.gson.Gson +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IDevListener +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_range_hood.* +import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView +import kotlinx.android.synthetic.main.activity_water_heater.rootView +import kotlinx.android.synthetic.main.include_device_title.* /** * 油烟机 * */ class RangeHoodActivity : KotlinBaseActivity() { + private val kTag = "RangeHoodActivity" + private val gson by lazy { Gson() } + private lateinit var deviceId: String + private lateinit var deviceInstance: ITuyaDevice + private var deviceBean: DeviceBean? = null + private var isDeviceWorking = false + override fun initLayoutView(): Int = R.layout.activity_range_hood override fun observeRequestState() { @@ -15,14 +40,151 @@ } override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + leftBackView.setOnClickListener { finish() } + titleView.text = "油烟机" } override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + Log.d(kTag, "deviceId: $deviceId") + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun onResume() { + super.onResume() + deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + + Glide.with(this) + .load(deviceBean?.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") } override fun initEvent() { + rightOperateView.setOnClickListener { + } + + //开关机 + turnOffButton.setOnClickListener { + val command = if (isDeviceWorking) { + "{\"1\": false}" + } else { + "{\"1\": true}" + } + CommandManager.sendTuyaDp(deviceInstance, command) + } + + //低速 + lowSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"low\"}") + } + + //高速 + highSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"high\"}") + } + + //爆炒 + maxSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"strong\"}") + } + + deviceInstance.registerDevListener(object : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + val key = parseObject.keys.first() + Log.d(kTag, "onDpUpdate: $dpStr") + when (key) { + "1" -> {//开关机 + isDeviceWorking = parseObject[key] as Boolean + deviceStateView.text = if (isDeviceWorking) { + "已开机" + } else { + "已关机" + } + deviceStateButton.text = if (isDeviceWorking) { + "关机" + } else { + "开机" + } + } + "11" -> {//风速,[off, low, middle, high, strong] + + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[key]}分" + } else { + "0分" + } + } + } + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/String.kt b/app/src/main/java/com/casic/br/extensions/String.kt index 50479c7..dd3ff27 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -6,8 +6,11 @@ import top.zibin.luban.Luban import top.zibin.luban.OnCompressListener import java.io.File +import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern +import kotlin.math.abs /** * String扩展方法 @@ -33,4 +36,39 @@ listener.onError(e) } }).launch() +} + +/** + * 时间差-天 + * */ +fun String.diffDate(): Int { + if (this.isBlank()) { + return 0 + } + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + try { + val timestamp = dateFormat.parse(this)!!.time + val diff = abs(System.currentTimeMillis() - timestamp) + return (diff / (86400000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 +} + +/** + * 时间差-分钟 + * */ +fun String.diffMinute(): Int { + if (this.isBlank()) { + return 0 + } + try { + val diff = abs(System.currentTimeMillis() - this.toLong()) + println(diff) + return (diff / (60000)).toInt() + } catch (e: ParseException) { + e.printStackTrace() + } + return 0 } \ No newline at end of file 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 3480d5b..e6c37c6 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -6,6 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter +import com.casic.br.extensions.diffDate import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel import com.casic.br.model.RecommendModel @@ -89,7 +90,11 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { + + Log.d(kTag, "dps: ${it.dps}") + val model = AddedDeviceModel() + model.deviceId = it.devId when (it.deviceCategory) { "yyj" -> model.deviceName = "万家乐油烟机" } @@ -97,7 +102,7 @@ model.deviceImage = it.iconUrl model.deviceModel = it.name model.deviceType = it.deviceCategory - model.deviceUsedTime = "未知" + model.deviceUsedTime = "已使用${it.time.toString().diffDate()}天" deviceModels.add(model) } @@ -141,7 +146,7 @@ requireContext().navigatePageTo(deviceModel.deviceName) } deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo() + requireContext().navigatePageTo(deviceModel.deviceId) } deviceModel.deviceName.contains("壁挂炉") -> { requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java index d4a358b..b74bb70 100644 --- a/app/src/main/java/com/casic/br/model/AddedDeviceModel.java +++ b/app/src/main/java/com/casic/br/model/AddedDeviceModel.java @@ -4,6 +4,7 @@ * 已添加设备(Iot和非Iot设备)数据模型 */ public class AddedDeviceModel { + private String deviceId; private String deviceName; private boolean isOnline; private String deviceImage; @@ -11,6 +12,14 @@ private String deviceType; private String deviceUsedTime; + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + public String getDeviceName() { return deviceName; } diff --git a/app/src/main/java/com/casic/br/utils/CommandManager.kt b/app/src/main/java/com/casic/br/utils/CommandManager.kt new file mode 100644 index 0000000..c2e436b --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/CommandManager.kt @@ -0,0 +1,33 @@ +package com.casic.br.utils + +import android.util.Log +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice + +object CommandManager { + private const val kTag = "CommandManager" + + fun getTuyaDp(deviceInstance: ITuyaDevice, dpId: String) { + deviceInstance.getDp(dpId, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } + + fun sendTuyaDp(deviceInstance: ITuyaDevice, cmd: String) { + deviceInstance.publishDps(cmd, object : IResultCallback { + override fun onSuccess() { + + } + + override fun onError(code: String?, error: String?) { + Log.e(kTag, "onError: $error") + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt index d8035fa..4b440ff 100644 --- a/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/RangeHoodActivity.kt @@ -1,13 +1,38 @@ package com.casic.br.view.device +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide import com.casic.br.R +import com.casic.br.extensions.diffMinute +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.CommandManager +import com.google.gson.Gson +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IDevListener +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_range_hood.* +import kotlinx.android.synthetic.main.activity_water_heater.deviceLogoView +import kotlinx.android.synthetic.main.activity_water_heater.rootView +import kotlinx.android.synthetic.main.include_device_title.* /** * 油烟机 * */ class RangeHoodActivity : KotlinBaseActivity() { + private val kTag = "RangeHoodActivity" + private val gson by lazy { Gson() } + private lateinit var deviceId: String + private lateinit var deviceInstance: ITuyaDevice + private var deviceBean: DeviceBean? = null + private var isDeviceWorking = false + override fun initLayoutView(): Int = R.layout.activity_range_hood override fun observeRequestState() { @@ -15,14 +40,151 @@ } override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + leftBackView.setOnClickListener { finish() } + titleView.text = "油烟机" } override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + Log.d(kTag, "deviceId: $deviceId") + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + } + + override fun onResume() { + super.onResume() + deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + + Glide.with(this) + .load(deviceBean?.iconUrl) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + //查询单个 DP 数据,查询后的数据会通过 IDevListener.onDpUpdate() 接口进行异步回调。 + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") } override fun initEvent() { + rightOperateView.setOnClickListener { + } + + //开关机 + turnOffButton.setOnClickListener { + val command = if (isDeviceWorking) { + "{\"1\": false}" + } else { + "{\"1\": true}" + } + CommandManager.sendTuyaDp(deviceInstance, command) + } + + //低速 + lowSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"low\"}") + } + + //高速 + highSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"high\"}") + } + + //爆炒 + maxSpeedView.setOnClickListener { + CommandManager.sendTuyaDp(deviceInstance, "{\"10\": \"strong\"}") + } + + deviceInstance.registerDevListener(object : IDevListener { + + /** + * DP 数据更新 + * + * @param devId 设备 ID + * @param dpStr 设备发生变动的功能点,为 JSON 字符串,数据格式:{"101": true} + */ + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + val key = parseObject.keys.first() + Log.d(kTag, "onDpUpdate: $dpStr") + when (key) { + "1" -> {//开关机 + isDeviceWorking = parseObject[key] as Boolean + deviceStateView.text = if (isDeviceWorking) { + "已开机" + } else { + "已关机" + } + deviceStateButton.text = if (isDeviceWorking) { + "关机" + } else { + "开机" + } + } + "11" -> {//风速,[off, low, middle, high, strong] + + } + "12" -> {//累计工作时间 + workingTimeView.text = if (isDeviceWorking) { + "${parseObject[key]}分" + } else { + "0分" + } + } + } + } + + /** + * 设备移除回调 + * + * @param devId 设备id + */ + override fun onRemoved(devId: String?) { + + } + + /** + * 设备上下线回调。如果设备断电或断网,服务端将会在3分钟后回调到此方法。 + * + * @param devId 设备 ID + * @param online 是否在线,在线为 true + */ + override fun onStatusChanged(devId: String?, online: Boolean) { + + } + + /** + * 网络状态发生变动时的回调 + * + * @param devId 设备 ID + * @param status 网络状态是否可用,可用为 true + */ + override fun onNetworkStatusChanged(devId: String?, status: Boolean) { + + } + + /** + * 设备信息更新回调 + * + * @param devId 设备 ID + */ + override fun onDevInfoUpdate(devId: String?) { + + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_range_hood.xml b/app/src/main/res/layout/activity_range_hood.xml index 811651f..77faeb6 100644 --- a/app/src/main/res/layout/activity_range_hood.xml +++ b/app/src/main/res/layout/activity_range_hood.xml @@ -1,6 +1,5 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file