diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ No newline at end of file diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_0 } \ No newline at end of file diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_2.xml b/app/src/main/res/drawable/ic_battery_2.xml new file mode 100644 index 0000000..a09a07f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_2.xml b/app/src/main/res/drawable/ic_battery_2.xml new file mode 100644 index 0000000..a09a07f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_3.xml b/app/src/main/res/drawable/ic_battery_3.xml new file mode 100644 index 0000000..21e3d58 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_3.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_2.xml b/app/src/main/res/drawable/ic_battery_2.xml new file mode 100644 index 0000000..a09a07f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_3.xml b/app/src/main/res/drawable/ic_battery_3.xml new file mode 100644 index 0000000..21e3d58 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_3.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_4.xml b/app/src/main/res/drawable/ic_battery_4.xml new file mode 100644 index 0000000..21fa5b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_4.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_2.xml b/app/src/main/res/drawable/ic_battery_2.xml new file mode 100644 index 0000000..a09a07f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_3.xml b/app/src/main/res/drawable/ic_battery_3.xml new file mode 100644 index 0000000..21e3d58 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_3.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_4.xml b/app/src/main/res/drawable/ic_battery_4.xml new file mode 100644 index 0000000..21fa5b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_4.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_motion_senser.xml b/app/src/main/res/layout/activity_motion_senser.xml new file mode 100644 index 0000000..87fde81 --- /dev/null +++ b/app/src/main/res/layout/activity_motion_senser.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/SmartKitchen.jks b/app/SmartKitchen.jks new file mode 100644 index 0000000..5ab2be7 --- /dev/null +++ b/app/SmartKitchen.jks Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 03d3f5d..445738d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -75,6 +75,7 @@ + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_motion_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + holder.logTimeView.text = dataRows[position] + } + + override fun getItemCount(): Int = dataRows.size + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val logTimeView: TextView = itemView.findViewById(R.id.logTimeView) + } +} \ 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 b57604b..c883156 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -2,6 +2,7 @@ import android.content.Context import android.util.Log +import com.casic.br.R import com.casic.br.callback.OnImageCompressListener import com.casic.br.model.ErrorMessageModel import com.casic.br.utils.LocaleConstant @@ -122,4 +123,23 @@ "wg2" -> "智能网关" else -> "其他" } +} + +//电量转图片 +fun String.toBatteryImage(): Int { + if (this.isBlank()) { + return R.drawable.ic_battery_0 + } + try { + when (this.toInt()) { + in 0..10 -> return R.drawable.ic_battery_0 + in 11..30 -> return R.drawable.ic_battery_1 + in 31..60 -> return R.drawable.ic_battery_2 + in 61..90 -> return R.drawable.ic_battery_3 + in 91..100 -> return R.drawable.ic_battery_4 + } + } catch (e: ClassCastException) { + e.printStackTrace() + } + return R.drawable.ic_battery_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 7f4b807..cf0ef3d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -11,14 +11,12 @@ import com.casic.br.extensions.selectCategory import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.LoginActivity import com.casic.br.view.device.* import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -61,7 +59,6 @@ val recommendAdapter = RecommendAdapter(requireContext(), recommendModels) recommendRecyclerView.adapter = recommendAdapter recommendAdapter.setOnItemClickListener(object : RecommendAdapter.OnItemClickListener { - override fun onItemClick(position: Int) { } @@ -80,12 +77,7 @@ override fun onResume() { super.onResume() - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { val deviceModels = bean.deviceList @@ -158,7 +150,13 @@ } selectedCategory.contains("wg2") -> { //网关 - requireContext().navigatePageTo(deviceModel.devId) + requireContext().navigatePageTo( + deviceModel.devId + ) + } + selectedCategory.contains("0204") -> { + //人体传感器 + requireContext().navigatePageTo() } } } else { diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 51c107c..695b39a 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -20,6 +20,24 @@ return userDetailModel.data } + fun getHomeId(): Long { + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + return if (homeId == "") { + val userModel = getUserModel() + if (userModel == null) { + Long.MAX_VALUE + } else { + if (userModel.syncDeptid == "") { + Long.MAX_VALUE + } else { + userModel.syncDeptid.toLong() + } + } + } else { + homeId.toLong() + } + } + fun isLogin(): Boolean { val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long return if (loginTime == 0L) { diff --git a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt index 237917f..6bd7edc 100644 --- a/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AllDeviceActivity.kt @@ -6,7 +6,7 @@ import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.extensions.selectCategory -import com.casic.br.utils.LocaleConstant +import com.casic.br.utils.DeserializeModel import com.casic.br.view.device.CookerActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity @@ -16,7 +16,6 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.bean.HomeBean @@ -45,12 +44,7 @@ } override fun initData() { - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - if (homeId == "") { - Log.e(kTag, "homeId is null") - return - } - TuyaHomeSdk.newHomeInstance(homeId.toLong()) + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { deviceModels = bean.deviceList 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 a796171..8a2c6c8 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -7,14 +7,12 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.home.sdk.TuyaHomeSdk import com.tuya.smart.home.sdk.builder.ActivatorBuilder @@ -53,9 +51,8 @@ return@setOnClickListener } LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String val userModel = DeserializeModel.getUserModel()!! - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + TuyaHomeSdk.getActivatorInstance().getActivatorToken(DeserializeModel.getHomeId(), object : ITuyaActivatorGetToken { override fun onSuccess(token: String) { //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 @@ -75,7 +72,7 @@ override fun onActiveSuccess(devResp: DeviceBean?) { //将绑定的设备存入自己的数据库 - deviceViewModel.addDevice(devResp!!,userModel) + deviceViewModel.addDevice(devResp!!, userModel) } override fun onStep(step: String?, data: Any?) { 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 b5f86e8..e1be1b1 100644 --- a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -7,7 +7,6 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.utils.DeserializeModel import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant import com.casic.br.vm.DeviceViewModel import com.casic.br.widgets.WaterRippleView import com.gyf.immersionbar.ImmersionBar @@ -15,7 +14,6 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.Constant -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState import com.tuya.smart.android.ble.api.LeScanSetting import com.tuya.smart.android.ble.api.ScanDeviceBean @@ -134,44 +132,44 @@ nextStepButton.setOnClickListener { LoadingDialogHub.show(this, "设备配网中,请稍后") val userModel = DeserializeModel.getUserModel()!! - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val homeId = DeserializeModel.getHomeId() - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : - ITuyaActivatorGetToken { - override fun onSuccess(token: String?) { - val multiModeActivatorBean = MultiModeActivatorBean() - multiModeActivatorBean.homeId = homeId.toLong() - 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.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) - } + // 开始配网 + 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(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() - } - }) + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) } } diff --git a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt new file mode 100644 index 0000000..5ecd0c8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -0,0 +1,128 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.adapter.MotionLogAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToTime +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean +import kotlinx.android.synthetic.main.activity_motion_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 运动传感器 + * TODO 数据上报暂缓 + * */ +class MotionSensorActivity : KotlinBaseActivity() { + + private val kTag = "MotionSensorActivity" + private val context = this@MotionSensorActivity + private val dataTimer by lazy { Timer() }//数据上传Timer + private val timeLinkedList = LinkedList() + private lateinit var weakReference: WeakReferenceHandler + private lateinit var motionAdapter: MotionLogAdapter + private var dataBeans: MutableList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_motion_senser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + weakReference = WeakReferenceHandler(callback) + motionAdapter = MotionLogAdapter(this, dataBeans) + motionRecyclerView.adapter = motionAdapter + //每隔5s传一次数据到服务器 + dataTimer.schedule(object : TimerTask() { + override fun run() { + TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + bean.deviceList.forEach { + val selectedCategory = it.selectCategory() + if (selectedCategory.contains("0204")) { + //人体传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022102001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d(kTag, "onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102001) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(context) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val value = it.dps["103"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + if (it.dps["101"] as Boolean) { + val time = (it.dpsTime["101"].toString().toLong()).timestampToTime() + timeLinkedList.add(time) + //需要判断当前最后一次时间喝上一次事件是否相同,相同就跳过 + if (timeLinkedList.size == 1) { + dataBeans.add(timeLinkedList.last) + } else if (timeLinkedList.last != timeLinkedList[timeLinkedList.size - 2]) { + dataBeans.add(timeLinkedList.last) + } + motionAdapter.notifyDataSetChanged() + } else { + Log.d(kTag, "未检测到人体数据") + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt index 5ab7f58..39214b2 100644 --- a/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SmartGatewayActivity.kt @@ -82,11 +82,6 @@ .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.load_image_error) .into(deviceLogoView) -// deviceSubInstance.registerSubDevListener(object :TuyaSubDeviceListener(){ -// override fun onSubDevDpUpdate(nodeId: String?, dps: String?) { -// Log.d(kTag, "onDpUpdate: $dps") -// } -// }) } override fun onResume() { @@ -131,10 +126,10 @@ val selectedCategory = deviceModel.selectCategory() Log.d(kTag, "设备类型: $selectedCategory") when { -// selectedCategory.contains("rs") -> { -// //热水器 -// navigatePageTo(deviceModel.devId) -// } + selectedCategory.contains("0204") -> { + //人体传感器 + navigatePageTo() + } // selectedCategory.contains("yyj") -> { // //油烟机 // navigatePageTo(deviceModel.devId) diff --git a/app/src/main/res/drawable/ic_battery_0.xml b/app/src/main/res/drawable/ic_battery_0.xml new file mode 100644 index 0000000..38425b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_0.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_1.xml b/app/src/main/res/drawable/ic_battery_1.xml new file mode 100644 index 0000000..93a6ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_1.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_2.xml b/app/src/main/res/drawable/ic_battery_2.xml new file mode 100644 index 0000000..a09a07f --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_2.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery_3.xml b/app/src/main/res/drawable/ic_battery_3.xml new file mode 100644 index 0000000..21e3d58 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_3.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_4.xml b/app/src/main/res/drawable/ic_battery_4.xml new file mode 100644 index 0000000..21fa5b9 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_4.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_motion_senser.xml b/app/src/main/res/layout/activity_motion_senser.xml new file mode 100644 index 0000000..87fde81 --- /dev/null +++ b/app/src/main/res/layout/activity_motion_senser.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_motion_rv_l.xml b/app/src/main/res/layout/item_motion_rv_l.xml new file mode 100644 index 0000000..fd907cc --- /dev/null +++ b/app/src/main/res/layout/item_motion_rv_l.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file